如何将多对多关系注入第三方模型?

时间:2016-05-06 06:47:29

标签: python django code-injection django-orm

我想在一些模型中插入多对多关系,而不必完全重写模型。

例如,请考虑我安装的第三方模块中的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)

就像多对多的关系一样?

2 个答案:

答案 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>