我的模型類看起來像:
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”。
我的意思是,這正是我要參考的列,但我找不到這樣做的正確方法。
uj5u.com熱心網友回復:
試試這篇文章,https://www.django-antipatterns.com/antipattern/foreign-key-with-id-suffix.html看看它是否能解決您的問題。
出現問題的主要原因是 .other_model 本身不存盤 id。實際上,Django 使用 _id 后綴創建了一個隱式雙欄位來存盤主鍵
uj5u.com熱心網友回復:
要從ForeignKey過濾,您只需傳遞該模型的實體
在你的第一種方法中:
wine_flavor = FlavorWine.objects.filter(wine_id__in=wines.values('wine_id'))
如果wine_id是Wine 模型的一個實體,那么您可以簡單地撰寫
wine_flavor = FlavorWine.objects.filter(wine_id=wine_id)
如果wine_id是來自Wine 模型的 id 串列,那么您可以正確執行以下操作:
wine_flavor = FlavorWine.objects.filter(wine_id__id__in=wine_id)
讓我解釋一下上面一行的作用,
假設 wine_id = ['1', '2', '3',....] 其中 '1' 代表Wine模型的id
然后從FlavorWine (FlavorWine.objects.filter)中過濾
Wine 模型( wine_id__id )的id位于串列 (wine_id) 中
(如果您需要更多幫助,請在下面發表評論,我可以相應地更新我的答案)
uj5u.com熱心網友回復:
因此,為了通過外鍵在相關模型之間進行過濾,這非常簡單,通過使用帶有模型相關名稱引數的 prefectt_ralated 函式。就像我下面的例子一樣。這是一個閱讀更多內容的鏈接,可幫助您了解與預取相關的查詢。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'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/417820.html
標籤:
