【问题标题】:Limit options of Django ManytoManyFieldDjango ManytoManyField 的限制选项
【发布时间】:2020-02-07 20:43:41
【问题描述】:

我的应用有 3 个模型:Podcasts、Episode 和 Categories。

类别有一个播客的外键:

class Category(models.Model):
    ...
    podcast = models.ForeignKey(Podcast, on_delete=models.CASCADE)
    ...

所以,一个播客可以有一堆相关的类别。

每一集都可以与播客的类别相关联。我已将其添加为 ManyToManyField:

class Episode(models.Model):

    podcast = models.ForeignKey(Podcast, on_delete=models.CASCADE)
    categories = models.ManyToManyField(Category)
    ...

问题在于,在管理和模型表单中,类别字段显示每个播客的每个类别的列表,而不仅仅是与此播客相关联的类别。

如何使用 limit_choices_to 仅限制具有与该剧集相关的同一播客的外键的类别?我尝试了以下方法,但显然不起作用,因为未定义“自我”。

categories = models.ManyToManyField(Category, limit_choices_to={'podcast': self.podcast})

如果可能,我想在模型级别执行此操作,因此我不必在应用程序的其余部分添加额外的逻辑。

感谢您的帮助!

【问题讨论】:

    标签: django django-models django-forms


    【解决方案1】:

    在我看来,您通常希望将 ManyToMany 关系与中间模型(在这种情况下为 Podcast)一起使用。除非您必须保持关系不变,否则请考虑以下解决方案:

    class Category(models.Model):
        title = models.CharField(max_length=120)
    
    
    class Episode(models.Model):
        title = models.CharField(max_length=120)
        categories = models.ManyToManyField(Category, through='Podcast')
    
    
    class Podcast(models.Model):
        category = models.ForeignKey(Category, on_delete=models.CASCADE)
        episode = models.ForeignKey(Episode, on_delete=models.CASCADE)
        title = models.CharField(max_length=120)
    

    https://docs.djangoproject.com/en/3.0/topics/db/models/#extra-fields-on-many-to-many-relationships

    【讨论】:

    • 这里的问题似乎是一个播客可以有多个类别。一个播客可以有多个类别,但一个类别只能有一个播客。一个情节可以有多个类别,类别可以有多个情节。但剧集和类别必须具有相同的播客。
    • 您认为具有 m2m 关系的 Category 和 Episode 模型的实例将引用不同的 Podcast 实例 - 对吗?通过创建中间模型的新实例,您可以通过中间模型在它们之间创建 m2m 关系。查看文档中的示例。
    • 可能是我理解错了,但是我说的是在上面的模型中,看起来像Podcast(这是一个episode的集合),只能和ONE episode关联,因为它是一个Podcast 模型上的外键。并且也只与一个类别相关联。我读错了吗?
    • ForeignKey是一对多的关系,所以这里一个Podcast实例可以关联多个Category和Episode实例。我认为这是您通常想要的。
    猜你喜欢
    • 1970-01-01
    • 2014-02-28
    • 2011-06-19
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多