我在Django遇到了一个DB查询问题。
我的数据库(models.py):
class Food(models.Model):
name = models.CharField(max_length=200)
...
class Combination(models.Model):
food1 = models.ForeignKey(Food, related_name='food1')
food2 = models.ForeignKey(Food, related_name='food2')
...
食物的搭配顺序对我的问题无关紧要。
此外,每个组合可以存在多次(并且在两个方向上)。
例如food1“巧克力”&food2“水果”与food2“巧克力”&food1“水果”相同
这两种组合存在多次。
如果我想找到所有的组合,包括一种特定的食物(由食物标识标识)
我目前正在求助于以下问题:
combinations1 = Combination.objects.filter(food1=food_id).values_list('food2')
combinations2 = Combination.objects.filter(food2=food_id).values_list('food1')
它可以工作,但以后需要更多的处理。我试着用Q对象和OR,
但我没有成功,因为提取的柱取决于过滤器…
我知道这个解决方案很不优雅。我应该使用自定义字段还是commasepartedintegerfield,而不是两个单独的食物字段的组合?
有没有一种方法可以在一次db命中的情况下获得所有请求的值(从两列中)?
谢谢你帮我!
干杯,
奥利弗
最佳答案
我认为你最好的办法是使用Q对象,比如
qs = Combination.objects.filter(Q(food1=food_id)|Q(food2=food_id).values_list('food1', 'food2')
combinations = set()
for row in qs:
if row[0] == food_id:
combinations.append(row[1])
else:
combinations.append(row[0])