Основываясь на этот вопрос SO о подсчете forgein ключи, у меня проблема. Это мои модели:
class Type(models.Model):
is_bulk = models.BooleanField()
class Component(models.Model):
parent = models.ForgeinKey(Type, related_name="components")
Я хочу написать набор запросов со всеми типами, кроме тех, у которых есть is_bulk=True и у которых нет компонентов. Если is_bulk=False, его следует включить. Если is_bulk=True и у вас есть 1+ связанных Компонентов, то вы включены. Если нет, вы исключены.
Основываясь на ответе, я попробовал этот набор запросов:
Type.objects.annotate(num_components=Count('components')).exclude(is_bulk=True, num_components=0)
Но он не возвращает никаких результатов.
Однако это означает, что должны быть результаты:
>>> [(x.is_bulk, x.num_components) for x in Type.objects.annotate(num_components=Count('components'))]
[(False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0), (False, 0)]
Все объекты типа имеют is_bulk=False и все они имеют 0 компонентов. Прочитав документацию .exclude(…), должно быть NOT(is_bulk=True AND num_components=0)
, что должно быть True для каждого типа. Верно? (Я сделал здесь недоразумение, если да, то какой правильный набор запросов)
Если нет, то почему этот набор запросов возвращает []
, когда он должен возвращать их все? Это ошибка в Django 1.3?
is_bulk=True
,num_components=0
или в их совместном использовании. - person Lycha   schedule 10.11.2011parent = models.ForgeinKey(Type)
это должно быть ForeignKey - person César   schedule 10.11.2011