首页 > 解决方案 > 基于关系过滤记录 | 姜戈

问题描述

我有以下型号:

class PodcastPlatform(models.Model):
    name = models.CharField(max_length = 60)
    badge_path = models.FilePathField(path = settings.BADGES_DIR, unique = True)

    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

class Podcast(models.Model):
    name = models.CharField(max_length = 60)
    description = models.CharField(max_length = 400)
    created = models.DateTimeField(auto_now_add = True)
    updated = models.DateTimeField(auto_now = True)

    class Meta:
        ordering = ['-created', '-updated']

    def __str__(self):
        return self.name

class PodcastLink(models.Model):
    podcast_platform = models.ForeignKey(PodcastPlatform, on_delete = models.CASCADE)
    podcast = models.ForeignKey(Podcast, on_delete = models.CASCADE)
    url = models.URLField(max_length = 400, verbose_name = 'URL')

    class Meta:
        ordering = ['podcast_platform__name']
        unique_together = ['podcast_platform', 'podcast']

    def __str__(self):
        return self.podcast_platform.name

    def get_badge_url(self):
        return static(re.search('img/.{0,}', self.podcast_platform.badge_path).group())

我想过滤Podcast具有至少一个链接或相关模型实例的PodcastLink模型实例。为此,我执行了以下操作:

Podcast.objects.filter(podcastlink__gte = 1)

返回以下查询集:

<QuerySet [<Podcast: Libero tenetur>, <Podcast: Libero tenetur>, <Podcast: Libero tenetur>, <Podcast: Assumenda iusto>, <Podcast: Assumenda iusto>, <Podcast: Assumenda iusto>, <Podcast: Assumenda iusto>, <Podcast: Explicabo>, <Podcast: Explicabo>, <Podcast: Explicabo>, <Podcast: Explicabo>, <Podcast: Explicabo>]>

我得到了预期的结果,但我注意到实例正在重复......尝试以下操作,并以同样的方式得到相同的结果(重复实例):

Podcast.objects.filter(Q(podcastlink__gte = 1))

为什么我会得到重复的实例?据我所知,这不应该发生......而且这很奇怪......

标签: pythondjango

解决方案


您可以使用distinct()来获取唯一实例。您可能还想过滤计数:

Podcast.objects.filter(podcastlink__count__gte = 1).distinct()

推荐阅读