如何在第三方模型中注入大量关系?

2021-10-17 14:38:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,考虑我安装的第三方模块中的djangoUser模型和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条回答
网友
1楼 ·

我能想到的最简洁的方法是提供一个中间类(或者可以提供几乎相同的查询的子类),一对一,然后多对多

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连接,但它确实保持了链接的灵活性,并提供了一种根据需要进行修改的方法。你知道吗

网友
2楼 ·

可以使用代理模型。这里person是第三方模型,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

相关问题