Django中能否不创建中间模型直接引用自动生成的多对多中间表?
可以直接引用自动生成的中间表,无需手动创建中间模型!
当然没问题——Django虽然会自动给ManyToManyField生成中间表,但我们依然能在其他模型里直接引用这个自动生成的中间表对应的模型,不用额外手动定义中间模型。
具体怎么做?
Django为ManyToManyField自动创建的中间模型,可以通过关联字段的through属性直接获取。针对你的代码场景,有两种可靠的实现方式:
方式1:直接引用through模型(推荐)
只要确保ModelB在ModelC之前定义,就可以直接用ModelB.model_a.through作为外键的关联模型:
class ModelA(models.Model): name = models.CharField(max_length=100) class ModelB(models.Model): name = models.CharField(max_length=100) model_a = models.ManyToManyField(ModelA, db_table="database_intermediate") # 这里指定表名和你描述的一致 class ModelC(models.Model): name = models.CharField(max_length=100) intermediate_ab = models.ForeignKey(ModelB.model_a.through, on_delete=models.CASCADE)
方式2:延迟引用模型(适合模型定义顺序受限的情况)
如果ModelC需要定义在ModelB之前,或者你想更灵活地引用,可以用应用名+自动生成的模型名作为字符串引用:
class ModelC(models.Model): name = models.CharField(max_length=100) # 假设你的应用名为database,自动生成的中间模型名是ModelBModelA intermediate_ab = models.ForeignKey("database.ModelBModelA", on_delete=models.CASCADE)
(自动生成的中间模型命名规则是[关联模型名][被关联模型名],比如这里ModelB关联ModelA,所以模型名是ModelBModelA)
注意事项
- 自动生成的中间模型只有默认字段:主键
id、model_a_id(外键到ModelA)、model_b_id(外键到ModelB),无法直接添加自定义字段;如果之后需要扩展中间表的字段,你还是得手动创建中间模型并通过through指定。 - 操作这个中间模型和普通模型完全一样,比如可以查询
ModelB和ModelA的关联记录,或者新增关联关系。
内容的提问来源于stack exchange,提问作者user1590821
相关产品推荐
相关产品推荐

