Django Query Set в Deep с исключением - PullRequest
0 голосов
/ 11 июля 2011

у меня есть три класса Продукт имеет много описаний, и каждая модель имеет много магазинов что я хочу сделать

select all products but store.qty value > 0

Я пробовал

pr = Product.objects.all().exclude(Product__Product_description__qty > 0)

как я могу это сделать?

class Product
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)

class Product_description
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    product = models.ForeignKey(Product)

class Store
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    desc = models.ForeignKey(Product_description)
    qty = models.IntegerField()

1 Ответ

2 голосов
/ 11 июля 2011
pr = Product.objects.filter(Product_description__qty__lte = 0)

Или, если вы действительно должны использовать exclude:

pr = Product.objects.exclude(Product_description__qty__gt = 0)

all() не обязательно в любом случае;В итоге вы просто создаете неуправляемый прокси, который впоследствии создает фильтр / исключает набор запросов.Это тратит впустую память и процессор, но иначе ничего не делает.Только для оператора .delete() требуется рабочий набор запросов all(), но это особый случай, разработанный специально для предотвращения случайного уничтожения наборов данных.

Документация Django Queryset API очень удобочитаема.

Соглашение Django - называть ваш класс ProductDescription.

Это похоже на обратную иерархию.Почему в магазинах есть «описания продуктов»?Разве это не метаданные о самом продукте, и что вас волнует, так это то, что в магазинах есть определенное количество продукта?Или это варианты товара, то есть вы хотите найти все товары, для которых в магазинах есть хотя бы один зеленый, синий или оранжевый?Что-то подсказывает мне, что ваш проект нуждается в тщательном переосмыслении.

...