【问题标题】:Proper way to add record to many to many relationship in Django在 Django 中向多对多关系添加记录的正确方法
【发布时间】:2011-06-02 03:28:41
【问题描述】:

首先,我计划在谷歌应用引擎上运行我的项目,所以我使用djangoappengine,据我所知它不支持django 的ManyToManyField 类型。因此,我将我的模型设置为:

from django.db import models
from django.contrib.auth.models import User

class Group(models.Model):
    name = models.CharField(max_length=200)

class UserGroup(models.Model):
    user = models.ForeignKey(User)
    group = models.ForeignKey(Group)

在一个页面上,我有一个表单字段,人们可以在其中输入组名。我希望此表单字段的结果为用户-组组合创建一个 UserGroup 对象,如果该组尚不存在,则创建一个新的 Group 对象。起初,我开始使用 add_group 方法将此逻辑放入 UserGroup 类中,但很快意识到将其放入 UserGroup 类中并没有什么意义。这样做的正确方法是什么?我看到了一些关于模型管理器的东西。这些是为了这个吗?

【问题讨论】:

    标签: django django-models django-managers django-orm


    【解决方案1】:

    来自Django docs

    Manager 是向 Django 模型提供数据库查询操作的接口

    因此,管理器不是创建模型新实例的方法。

    我只需要一个 Group 模型的构造函数,它从关键字参数中提取 User(如果已给出)并创建一个新的 UserGroup

    因此,如果您将新的Group 实例化为Group(name='group name', user=some_user),则构造函数可以去掉user 关键字参数并使用user 创建适当的UserGroup

    class Group(models.Model):
        name = models.CharField(max_length=200)
    
        def __init__(self, *args, **kwargs):
            # Remove user from the kwargs.
            # It is important that user is removed from the kwargs before calling
            # the super.__init__(). This is because the `user` kwarg is not expected.
            user = kwargs.pop('user', None)
    
            # call the normal init method
            super(Group, self).__init__(*args, **kwargs)
    
            # Create the UserGroup instance for the specified user
            if user is not None:
                # Maybe some other logic here ...
                UserGroup(user=user, group=self).save()
    

    这样,如果您在实例化Group 时提供user,它将创建一个UserGroup,否则不会执行任何操作。

    当然,你同样可以在 UserGroup 模型的构造函数中做类似的事情,这并不重要,它只是取决于你的代码在隐喻上是有意义的。

    编辑:

    修复了 cmets 中指出的问题:

    ...
    def __init__(self, *args, **kwargs):
        ...
        self._user_group = UserGroup(user=user, group=self)
    
    def save(self, *args, **kwargs):
        super(Group, self).save(*args, **kwargs)
        self._user_group.save()
    

    【讨论】:

    • 在没有Group的情况下如何自m2m呢?也许我读错了。没读完。
    • 就是这个意思,呵呵。但这是一种优雅的方式!我打错了我的意思是在没有组的情况下如何保存m2m。
    • 在我所做的编辑中,在对 Group 模型进行超级调用后,保存了 UserGroup m2m through 模型。因此保存组,然后保存用户组。所以集团确实存在。
    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 2016-12-29
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多