首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >限制Django ManytoManyField的选项

限制Django ManytoManyField的选项
EN

Stack Overflow用户
提问于 2020-02-08 04:43:42
回答 1查看 31关注 0票数 0

我有一个应用程序,有3个模型:播客,剧集和类别。

类别有一个播客的ForeignKey:

代码语言:javascript
复制
class Category(models.Model):
    ...
    podcast = models.ForeignKey(Podcast, on_delete=models.CASCADE)
    ...

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

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

代码语言:javascript
复制
class Episode(models.Model):

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

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

如何使用limit_choices_to来限制与该事件相关的同一播客的外键类别?我尝试了下面的方法,但显然不起作用,因为'self‘没有定义。

代码语言:javascript
复制
categories = models.ManyToManyField(Category, limit_choices_to={'podcast': self.podcast})

如果可能的话,我想在模型级别上这样做,这样我就不需要在应用程序的其余部分添加额外的逻辑。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2020-02-08 08:11:24

对我来说,这似乎是你通常想要在中间模型(本例中是播客)中使用ManyToMany关系的情况。除非您必须保持关系的原样,否则请考虑以下解决方案:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60120806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档