3

DjangoのDBクエリで問題が発生しています。

私の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 = "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')

動作しますが、後でさらに処理する必要があります。ORでQオブジェクトを使用しようとしましたが、抽出された列がフィルターに依存しているため、成功しませんでした...

私はこの解決策がエレガントとはほど遠いことを知っています。2つの別々のフードフィールドを組み合わせて使用​​する代わりに、カスタムフィールドまたはCommaSeparatedIntegerFieldを使用する必要がありますか?1つのDBヒットで(両方の列から)要求されたすべての値を取得する方法はありますか?

私を助けてくれてありがとう!

乾杯、
オリバー

4

2 に答える 2

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 に答える
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 に答える