簡體   English   中英

通過外鍵過濾 Django 中的聯接表中的數據

[英]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 KeyDjango: 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_idWine model的一個實例,那么你可以簡單地寫

 wine_flavor = FlavorWine.objects.filter(wine_id=wine_id)

如果wine_idWine model的 id 列表,那么您可以正確執行以下操作:

wine_flavor = FlavorWine.objects.filter(wine_id__id__in=wine_id)

讓我解釋一下上面一行的作用,

假設 wine_id = ['1', '2', '3',....] 其中 '1' 代表Wine modelid

然后從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM