如何将多个模型绑定到一个ManyToManyfield? [英] How to bind multiple models to one ManyToManyField?

查看:16
本文介绍了如何将多个模型绑定到一个ManyToManyfield?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

例如,有这样的类:

class A(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
 mtm = models.ManyToManyField(B, C, D)

class B(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
class C(models.Model):
 id = models.CharField(max_length=256, primary_key=True)
class D(models.Model):
 id = models.CharField(max_length=256, primary_key=True)

我知道字段的实现类和错误,这样做是为了让它更清楚。你需要拥有那个模特,并与模特B、C、D建立关系ManyToMany。如何才能做到这一点?是否有特殊字段?

推荐答案

在撰写本文时,这是不可能的。AManyToManyField [Django-doc]具有位置to参数:

class ManyToManyField(to, **options)

多对多关系。需要位置参数: 与模型相关的类,其工作方式与 它适用于ForeignKey,包括递归关系和懒惰关系。

还会造成一些混淆:mtm应该为some_a.mtm.all()返回什么?是否所有相关的B对象?BCD对象的元组?反转关系的名称应该是什么?

但是,

这并不意味着您不能模拟这种关系。您可以创建一个行为类似于关系的模型。事实上,如果您定义ManyToManyField,Django将创建一个表来存储此关系中的数据。

这样我们就可以定义这样的模型:

class ABCDRel(models.Model):
    a = models.ForeignKey(A, on_delete=models.CASCADE, related_name='mtm')
    b = models.ForeignKey(B, on_delete=models.CASCADE, related_name='mtm')
    c = models.ForeignKey(C, on_delete=models.CASCADE, related_name='mtm')
    d = models.ForeignKey(D, on_delete=models.CASCADE, related_name='mtm')

例如,我们可以使用以下命令获取所有相关ABCDRelation中的QuerySet

some_a.mtm.all()

或者您可以通过以下关系获取所有相关B对象的QuerySet

B.objects.filter(mtm__a=some_a)

该关系可以包含额外的数据,但本质上会存储模型的对象如何相互关联的"元组"。

这样就创建了一个实体-关系模型,该模型或多或少如下所示:

这篇关于如何将多个模型绑定到一个ManyToManyfield?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆