Django外键不适用于一对多关系

时间:2016-11-16 00:19:10

标签: python django orm

我试图写一个查询,当搜索艺术家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)模型。

3 个答案:

答案 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.Values() document

  

返回一个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