我试图写一个查询,当搜索艺术家ID时,该艺术家的信息及其所有部分都是结果,基本上是Artist
和{{之间的连接查询1}}
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)
上述工作,但它不会选择ArtistPiece模型中的任何数据,尽管有主键。然后在阅读关于使用#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')
的{{3}}之后,我意识到我不必查看艺术家,而是必须通过foreign_key查找ArtistPiece,并使用select_related查找有关艺术家的信息。
然后我尝试了这个
select_related
导致以下错误def edit(self, request, artist_id):
artist = ArtistPiece.objects.get()
data = model_to_dict(artist)
返回多个ArtistPiece - 它返回5!搜索时,我发现this post表示我需要使用过滤器而不是get。然后我尝试了这个
get()
其中出现以下错误def edit(self, request, artist_id):
artist = ArtistPiece.objects.select_related('artist').filter(artist=artist_id)
data = model_to_dict(artist)
。我尝试搜索此错误并找到this post,它基本上建议使用get,这似乎与我发现的其他内容相反。
总而言之,我只是想选择一位艺术家和他们的作品,但我似乎无法弄清楚如何。
编辑 - 我尝试了一些事情并取得了一些进展,但它仍然无法正常工作
为了清楚起见,我试图编写一个查询,通过他们的ID查找艺术家,结果将是艺术家的信息和艺术家的作品。我可以根据artist_id或'QuerySet' object has no attribute '_meta'
模型查询和检索Artist
模型,但不会返回一个将同时返回ArtistPiece
和所有Artist
条目的查询那个艺术家。
将@ ArtistPiece
添加到我的模型中@bignose建议,然后我尝试了related_name='pieces'
,但仍然给出了上面的no属性....错误。然后我将artist = Artist.objects.select_related('pieces').filter(pk=artist_id)
更改为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)
模型。
答案 0 :(得分:0)
model_to_dict
接受单个模型对象,但是您传递的是QuerySet
类型的对象(与列表非常相似)。要获取所有对象的dicts列表,您需要在每个模型对象上显式调用model_to_dict
,如:
data = [model_to_dict(a) for a in artist]
更好的方法是使用QuerySet.values()
:
data = artist.values()
返回一个QuerySet,当用作可迭代时,它返回字典而不是模型实例。
这些词典中的每一个都代表一个对象,其中的键对应于模型对象的属性名称。
另请查看Serializer
课程。我认为这对你有用。
答案 1 :(得分:0)
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
个实例时,它会自动为引用该QueryManager
的{{1}}个实例提供ArtistPiece
的属性。
这很好,因为它意味着外键关系在一个地方定义,但也可以从另一端访问。
有关如何使用这些功能的信息,请参阅“Following relationships “backwards””的文档。
答案 2 :(得分:0)
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