[英]Django foreign key not working for One-To-Many relationship
我想編寫一個查詢,當一個藝術家ID進行搜索,該藝術家的信息和所有的作品都是結果,基本上是與連接查詢Artist
和ArtistPiece
#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,當用作可迭代時,它返回字典而不是模型實例。
每個字典代表一個對象,其中的鍵對應於模型對象的屬性名稱。
另請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
實例時,它會自動擁有一個屬性,該屬性是引用該Artist
的ArtistPiece
實例的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.