首页 > 解决方案 > django多对多查询

问题描述

我正在尝试创建一个可以帮助我存储旧音乐的应用程序。这些是我的模型。

class ArtistGenre(models.Model):
    genre_name = models.CharField('Genre', max_length=20)

    def __str__(self):
        return self.genre_name
    def get_absolute_url(self):
        return reverse('genre_detail', kwargs={'pk': self.pk})

class ArtistTrait(models.Model):
    trait_name = models.CharField('Trait', max_length=20)

    def __str__(self):
        return self.trait_name
    def get_absolute_url(self):
        return reverse('trait_detail', kwargs={'pk': self.pk})

class Artist(models.Model):
    stage_name = models.CharField('Stage Name', max_length=255)
    real_name = models.CharField('Birth Name', max_length=255, blank=True)
    artist_genre = models.ForeignKey(ArtistGenre, on_delete=models.CASCADE)
    artist_trait = models.ManyToManyField(ArtistTrait)

    def __str__(self):
        return self.stage_name 
    def get_absolute_url(self):
        return reverse('profile_artist', kwargs={'pk': self.pk})

我的问题是正确查询 ArtistGenre 和 ArtistTrait 模型,以创建可点击的链接,列出一个流派或具有特定特征的所有艺术家。我是否必须在链接到艺术家的 Trait 和 Genre 模型中创建多对多字段,或者我目前有办法查询它吗?谢谢你!

标签: pythondjango

解决方案


你可能需要这样的东西:

class Artist(models.Model):
    stage_name = models.CharField('Stage Name', max_length=255)
    real_name = models.CharField('Birth Name', max_length=255, blank=True)
    artist_genre = models.ForeignKey(ArtistGenre, on_delete=models.CASCADE, related_name='artists')
    artist_trait = models.ManyToManyField(ArtistTrait, related_name='artists')

现在,从给定的流派或特征模型中,您将能够获得所有艺术家,因为该related_name属性。

# Get all artists from the ArtistGenre - 
genre = ArtistGenre.objects.first()
artists = genre.artists.all()

# Get all artists from ArtistTrait
artists = ArtistTrait.artists.all()


推荐阅读