我想在一些模型中插入多对多关系,而不必完全重写模型。
例如,请考虑我安装的第三方模块中的django User
模型和模型Foo
。
如果我'拥有'Foo我可以做:
class Foo(models.Model):
users = models.ManyToMany(User)
然后,如果我想向用户添加Foo
,反之亦然,我可以这样做:
my_user.foo_set.add(my_foo)
my_foo.users.add(my_user)
但是我没有'拥有'任何代码,我想注入这种关系,所以我可以做到以上。
现在,如果我想,我甚至可以通过我制作的模型进行直接关系,并将其放在任何一方,但这仍然需要改变模型。
现在,在幕后它看起来像django多对多关系是模型(它们肯定有表),是否可以制作这段代码:
class FooUserRelationship(models.Model):
foo = ForeignKey(Foo)
user = ForeignKey(User)
就像多对多的关系一样?
答案 0 :(得分:1)
您可以使用代理模型。这里的人是第三方模型,Myperson是修改主要模型的额外属性的模型。有关详情https://docs.djangoproject.com/en/1.9/topics/db/models/#proxy-models
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
class MyPerson(Person):
users = models.ManyToMany(User)
class Meta:
proxy = True
答案 1 :(得分:1)
我能想到的最干净的方法是提供一个中产阶级(或者你可以提供几乎相同的查询的子类),一边是onetoone,另一边是多对
class FooUser(models.Model):
user = OneToOneField(AUTH_USER_MODEL)
foo = ManyToMany(Foo)
my_user.foouser.foo_set.add(my_foo)
my_foo.foousers.add(my_user.foouser)
现在我承认这不是最干净的做事方式,因为它会在检索结果时涉及进一步的SQL连接,但它会确保你的链接,并提供一种随意修改的方法。 / p>