[英]Filtering data from joining table in Django by foreign key
我有 model 類,看起來像:
class Wine(models.Model):
wine_id = models.IntegerField(blank=True, null=False, primary_key=True)
wine_name = models.TextField(blank=True, null=True)
wine_type = models.TextField(blank=True, null=True)
wine_year = models.IntegerField(blank=True, null=True)
wine_alcohol = models.FloatField(blank=True, null=True)
wine_country = models.TextField(blank=True, null=True)
wine_price = models.FloatField(blank=True, null=True)
class Meta:
managed = False
db_table = 'wine'
class Flavor(models.Model):
flavor_id = models.IntegerField(primary_key=False)
flavor_name = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'flavor'
以及這兩者之間的一個連接表:
class FlavorWine(models.Model):
flavor_wine_id = models.IntegerField(blank=True, null=False, primary_key=True)
flavor_group = models.TextField(blank=True, null=True)
flavor_count = models.IntegerField(blank=True, null=True)
wine_id = models.ForeignKey('Wine', on_delete=models.DO_NOTHING)
flavor_id = models.ForeignKey('Flavor', on_delete=models.DO_NOTHING)
class Meta:
managed = False
db_table = 'flavor_wine'
現在,每當我嘗試檢索數據時,都會出錯。 我嘗試使用以下示例: Django Filter by Foreign Key和Django: join two tables ,但沒有成功。
我試過了:
wines = Wine.objects.filter(wine_id=wine_id)
wine_flavor = FlavorWine.objects.filter(wine_id__in=wines.values('wine_id'))
return HttpResponse(serializers.serialize('json', wine_flavor, fields=('wine_id', 'flavor_group', 'flavor_count', 'flavor_id')))
和
wine_flavor = serializers.serialize('json', FlavorWine.objects.filter(wine_id_id__gt=wine_id), fields=('wine_id', 'flavor_group', 'flavor_count', 'flavor_id'))
和
wine_flavor = serializers.serialize('json', FlavorWine.objects.filter(wine_id__flavorwine__exact=wine_id), fields=('wine_id', 'flavor_group', 'flavor_count', 'flavor_id'))
並且提供了不同的組合,但它們都不起作用,要么在加入表時失敗,要么找不到所需的字段。 我總是得到提示:
提示:也許您的意思是引用列“flavor_wine.wine_id”。
我的意思是,這正是我要引用的列,但我找不到這樣做的正確方法。
試試這篇文章https://www.django-antipatterns.com/antipattern/foreign-key-with-id-suffix.html看看它是否能解決您的問題。
出現問題的主要原因是.other_model本身並沒有存儲id。 實際上,Django 使用存儲主鍵的 _id 后綴創建了一個隱式雙字段
要從ForeignKey過濾,您只需傳遞該模型的實例
在你的第一種方法中:
wine_flavor = FlavorWine.objects.filter(wine_id__in=wines.values('wine_id'))
如果wine_id是Wine model的一個實例,那么你可以簡單地寫
wine_flavor = FlavorWine.objects.filter(wine_id=wine_id)
如果wine_id是Wine model的 id 列表,那么您可以正確執行以下操作:
wine_flavor = FlavorWine.objects.filter(wine_id__id__in=wine_id)
讓我解釋一下上面一行的作用,
假設 wine_id = ['1', '2', '3',....] 其中 '1' 代表Wine model的id
然后從FlavorWine (FlavorWine.objects.filter) 中過濾
Wine model (wine_id__id) 的id在 list(wine_id) 中
(如果您需要更多幫助,請在下面發表評論,我可以相應地更新我的答案)
因此,為了通過外鍵在相關模型之間進行過濾,這非常簡單,通過使用帶有模型相關名稱參數的 prefectt_ralated function 。 就像我下面的例子一樣。 這是一個閱讀更多內容的鏈接,可幫助您了解與預取相關的查詢。 https://docs.djangoproject.com/en/4.0/ref/models/querysets/#prefetch-related
wines = Wine.objects.prefetch_related('flavorwine_set').filter(wine_id=wine_id)
wine_flavor = FlavorWine.objects.prefetch_related('flavorwine_set').filter(wine_id__in=wines.values('wine_id'))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.