Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
196 views
in Technique[技术] by (71.8m points)

python - Get all related objects with filter on through model

I have the next database structure:

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 feature flag used to define is this artist main for this artwork.
In ArtworkNode I want to define main_artist field:

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

And then in the ArtworkService I can access artwork artists like:

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

        return artist

Is there any way I can filter artists on ArtworkInfo and get only one main artist or access values in ArtistArtwork model?

question from:https://stackoverflow.com/questions/65942812/get-all-related-objects-with-filter-on-through-model

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use related name:

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

And then in the ArtworkService

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...