簡體   English   中英

Django外鍵不適用於One-To-Many關系

[英]Django foreign key not working for One-To-Many relationship

我想編寫一個查詢,當一個藝術家ID進行搜索,該藝術家的信息和所有的作品都是結果,基本上是與連接查詢ArtistArtistPiece

#models.py
class Artist(models.Model):
    name = models.CharField(max_length=100)
    artist = models.CharField(max_length=150)
    created_by = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

class ArtistPiece(models.Model):
    artist = models.ForeignKey(Artist, on_delete = models.CASCADE)
    piece_name = models.CharField(max_length=50)
    details = models.CharField(max_length=100)
#views.py
from .models import Artist, ArtistPiece

class EditArtistViewSet(viewsets.ViewSet):

    def edit(self,request,artist_id):
        artist = Artist.objects.select_related().get(pk=artist_id)
        data = model_to_dict(artist)
        return render(
            request, 'ArtistInfo/edit.html', {
                'editing': 'true',
                'edit_data': json.dumps(data),
            }) 

    def submit_edit(self,request):
        return render(request, 'ArtistInfo/edit.html')

上述工作,但它不會選擇ArtistPiece模型中的任何數據,盡管主鍵。 然后在閱讀了關於使用select_related 這篇文章后 ,我意識到我不得不通過foreign_key查找ArtistPiece,而是使用select_related來查找有關藝術家的信息。

然后我嘗試了這個

def edit(self, request, artist_id):
    artist = ArtistPiece.objects.get()
    data = model_to_dict(artist)

這導致以下錯誤get()返回多個ArtistPiece - 它返回5! 搜索,我發現這篇文章說明我需要使用過濾器而不是獲取。 然后我嘗試了這個

def edit(self, request, artist_id):
    artist = ArtistPiece.objects.select_related('artist').filter(artist=artist_id)
    data = model_to_dict(artist)

哪個給出了以下錯誤'QuerySet' object has no attribute '_meta' 我試圖搜索這個錯誤,發現基本上建議使用get,這似乎與我發現的其他一切相反。

總而言之,我只想選擇一位藝術家和他們的作品,但我似乎無法弄清楚如何。

編輯 - 我嘗試了一些事情並取得了一些進展,但它仍然無法正常工作

為了清楚起見,我正在嘗試編寫一個查詢,通過他們的id查找藝術家,結果將是藝術家的信息和藝術家的作品。 我可以基於artist_id或ArtistPiece模型查詢和檢索Artist模型,但不能查詢將返回Artist和與該藝術家相關聯的所有ArtistPiece條目的查詢。

在@bignose建議的情況下將related_name related_name='pieces'添加到我的模型中,然后我嘗試了artist = Artist.objects.select_related('pieces').filter(pk=artist_id)但仍然給出了no屬性....上面的錯誤。 然后我將data = model_to_dict(artist)更改為data = [model_to_dict(a) for a in artist] ArtistPiece data = [model_to_dict(a) for a in artist]並且它有效,但數據只是藝術家而且沒有來自ArtistPiece模型。

我沒有查詢Artist模型,而是嘗試查詢ArtistPiece模型: artist = ArtistPiece.objects.select_related('artist').filter(artist=artist_id) ,但之后只返回藝術家的作品,並且沒有來自Artist模型。

model_to_dict接受單個模型對象,但是你傳遞的是QuerySet類型的對象(這與list非常相似)。 要獲取所有對象的dicts列表,您需要在每個模型對象上顯式調用model_to_dict ,如:

data = [model_to_dict(a) for a in artist]

更好的方法是使用QuerySet.values()

data = artist.values()

根據Queryset.Values()文檔

返回一個QuerySet,當用作可迭代時,它返回字典而不是模型實例。

每個字典代表一個對象,其中的鍵對應於模型對象的屬性名稱。

另請Serializer類。 我認為這對你有用。

ForeignKey字段類型自動也在外部模型上設置屬性; 在你的情況下, Artist.artistpieces_set

favourite_artist = Artist.objects.get(pk="foo")  # However you get an Artist instance.
favourite_artist.artistpieces_set  # Is a QuerySet of all the ArtistPiece instances that reference this instance.

# Because it's a QuerySet, you can iterate it, filter it, etc.
for piece in favourite_artist.artistpieces_set.all():
    put_in_exhibition(piece)

因此,當您獲得Artist實例時,它會自動擁有一個屬性,該屬性是引用該ArtistArtistPiece實例的QueryManager

這很好,因為它意味着外鍵關系在一個地方定義,但也可以從另一端訪問。

有關如何使用這些功能,請參閱“ 關系后續關系”的文檔。

ArtistPiece.objects.filter(artist=artist_id) ,這將返回一個查詢集。
如果你想要一個列表你可以做ArtistPiece.objects.filter(artist=artist_id).values_list('id', flat=True)
https://docs.djangoproject.com/en/1.10/ref/models/querysets/#values-list

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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