既然你存儲的顏色爲純文本,而不是使用相關的模型沒有得到執行,你不能使用你想要的那種過濾器。
做正確的方法是使用ManyToManyField
:顏色可以有多個產品,一個產品可以有多種顏色:
class Color(models.Model):
name = models.CharField(max_length=255)
class Product(models.Model):
colors = models.ManyToManyField(Color, related_name='colors')
然後,您可以添加顏色是這樣的:
blue = Color(name='blue')
blue.save()
red = Color(name='red')
red.save()
my_product = Product()
my_product.save()
my_product.colors.add(blue)
如果你想查詢是紅色或藍色的所有產品,只是做:
Product.objects.filter(colors__in=[red, blue]) # Red and blue being Color instances
如果您想獲得紅色和藍色的所有產品,只是做描述here:
Product.objects.filter(colors=red).filter(colors=blue) # Red and blue being Color instances
鏈接過濾器這樣不是特別方便,所以你可能需要一個定製QuerySet
會爲你做它:
class AllManyToManyQuerySet(models.QuerySet):
def filter_all_many_to_many(self, attribute, *args):
qs = self
for arg in args:
qs = qs.filter(**{attribute: arg})
return qs
class Product(models.Model):
colors = models.ManyToManyField(Color, related_name='colors')
objects = AllManyToManyQuerySet.as_manager()
而且使用它是這樣的:
Product.objects.all().filter_all_many_to_many('colors', red, blue) # red and blue being color instances
另一個過濾器的方法是:
product_list = Product.objects.filter(reduce(operator.and_, [Q(colors__name=c) for c in colors]))
這是未經測試,但它可能應該工作,你可以使用其他類的查詢集,如果你需要它在其他地方,讓你的代碼清潔和乾燥;)
孩子是性別? – nthall
哈哈。現在好多了 ? –
另外,您可能希望使用'choices'屬性來選擇可能的顏色(如果您選擇不使用單獨的顏色模型) – Sayse