3

我在 Django 中遇到了数据库查询问题。

我的数据库(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="chocolate" & food2="fruit" 与 food2="chocolate" & food1="fruit" 相同
,两种组合都存在多次。

如果我想找到包括特定食物(由 food_id 标识)在内的所有组合,
我目前正在求助于以下查询:

combinations1 = Combination.objects.filter(food1=food_id).values_list('food2')
combinations2 = Combination.objects.filter(food2=food_id).values_list('food1')

它可以工作,但以后需要更多处理。我尝试将 Q 对象与 OR 一起使用,但我没有成功,因为提取的列取决于过滤器......

我知道这个解决方案远非优雅。我应该使用自定义字段还是 CommaSeparatedIntegerField 而不是组合中的两个单独的食物字段?有没有办法通过一个 DB Hit 获取所有请求的值(来自两列)?

谢谢你的协助!

干杯,
奥利弗

4

2 回答 2

2

不是吗

itertools.chain(Food(id=food_id).food1.all(), Food(id=food_id).food2.all())

你在追求什么?

如果食物的组合顺序无关紧要,为什么不使用ManyToManyField(Food)on Combination?然后Food(id=food_id).combination_set.all()将是所有包含特定食物的组合。

于 2012-04-05T12:07:04.177 回答
2

我认为您最好的选择是使用 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])
于 2012-04-05T10:51:26.653 回答