3

首先,我计划在 google app engine 上运行我的项目,所以我使用的是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 对象。起初,我开始使用方法将此逻辑放入 UserGroup 类中,add_group但很快意识到将其放入类中没有任何意义UserGroup。这样做的正确方法是什么?我看到了一些关于模型管理器的东西。这是为了这些吗?

4

1 回答 1

3

来自Django 文档

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

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

我只会有一个Group模型的构造函数,它从关键字参数中提取User(如果给定的话)并创建一个新的UserGroup.

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

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()

这样,如果您user在实例化时提供 a Group,它将创建 aUserGroup并且不会执行任何其他操作。

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

编辑:

对评论中指出的问题的修复:

...
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()
于 2011-01-01T04:48:13.990 回答