【发布时间】:2016-11-16 00:19:09
【问题描述】:
我正在尝试编写一个查询,当搜索艺术家 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 模型中选择任何数据,尽管有主键。然后在阅读this post 关于使用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!。搜索,我发现this post 表明我需要使用过滤器而不是获取。然后我尝试了这个
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'。我尝试搜索这个错误,发现 this 基本上建议使用 get,这似乎与我发现的所有其他内容背道而驰。
总而言之,我只想选择一位艺术家和他们的作品,但我似乎无法弄清楚如何。
编辑 - 我尝试了一些方法并取得了一些进展,但仍然无法正常工作
为了清楚起见,我正在尝试编写一个查询,该查询将通过他们的 id 查找艺术家,结果将是艺术家的信息和艺术家的作品。我可以根据艺术家 ID 或 ArtistPiece 模型查询和检索 Artist 模型,但没有一个查询会同时返回 Artist 和与该艺术家关联的所有 ArtistPiece 条目。
按照@bignose 的建议将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 模型中没有任何数据。
我没有查询Artist 模型,而是尝试查询ArtistPiece 模型:artist = ArtistPiece.objects.select_related('artist').filter(artist=artist_id),但是只返回了艺术家的作品,没有来自Artist 模型的信息。
【问题讨论】:
-
我已将
ArtistPiece的名称修改为单数;该名称应反映每个实例代表其中 一个 的事实。