【问题标题】:Get all related objects with filter on through model通过模型过滤器获取所有相关对象
【发布时间】:2021-05-02 16:25:49
【问题描述】:

我有下一个数据库结构:

class Artwork():
    id = models.IntegerField(_('id'), primary_key=True)
    artists = models.ManyToManyField('gql_service.Artist',
                                     through='gql_service.ArtistArtwork')

class ArtistArtwork(models.Model): 
    artist = models.ForeignKey('gql_service.Artist')
    artwork = models.ForeignKey('gql_service.Artwork')
    is_main_artist = models.BooleanField(default=False)

class Artist(models.Model):
    id = models.IntegerField(_('id'), primary_key=True)

is_main_artist 用于定义该艺术家是否是该艺术品的主要特征标志。
ArtworkNode我想定义main_artist字段:

class ArtworkNode(PrimaryKeyMixin, DjangoObjectType):
    main_artist = graphene.Field('escher.gql_service.schema.artist_node.ArtistNode')
    def resolve_main_artist(self, _):
        return ArtworkInfo(self).main_artist

然后在ArtworkService 我可以访问艺术艺术家,例如:

class ArtworkInfo(object):
    @property
    def main_artist(self):
        artist = self.artwork.artists.first()

        return artist

有什么方法可以过滤ArtworkInfo 上的艺术家并只获取一位主要艺术家或访问ArtistArtwork 模型中的值?

【问题讨论】:

    标签: python django graphql graphene-python


    【解决方案1】:

    您可以使用相关名称:

    class ArtistArtwork(models.Model): 
        ...
        artwork = models.ForeignKey('gql_service.Artwork', related_name='artwork_artistartwork')
    

    然后在ArtworkService

    class ArtworkInfo(object):
        @property
        def main_artist(self):
            artist = self.artwork.objects.filter(artwork_artistartwork__is_main_artist=True).first()
            return artist
    

    【讨论】:

      【解决方案2】:

      是这样的:

          @property
          def main_artist(self):
              return self.artwork.artists.filter(
                  artistartwork__is_main_artist=True
              ).first()
      

      【讨论】:

      • 这行得通吗?我认为您应该为反向查找添加 _set 对吗?
      • 好的。我得到了它。这是因为通过参数。
      • 设置它返回错误“无法将关键字'artistartwork_set'解析到字段中。选择是:artistartwork,...”
      • 好的。知道了。 _set 在使用 through 时对反向查找没有用。
      猜你喜欢
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2017-06-22
      相关资源
      最近更新 更多