首先,我打算在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对象。最初,我开始使用
add_group
方法将此逻辑放入UserGroup类中,但很快意识到将其放入UserGroup
类实际上没有任何意义。正确的做法是什么?我看到了一些有关模型经理的东西。这就是这些的目的吗? 最佳答案
从Django docs:
Manager是用于将数据库查询操作提供给Django模型的接口
因此,管理器不是创建模型新实例的方法。
我只需要一个Group
模型的构造函数,该模型将从关键字参数中提取User
(如果已给出)并创建一个新的UserGroup
。
因此,如果您将新的Group
实例化为Group(name='group name', user=some_user)
,则构造函数可以删除user
关键字参数,并使用该UserGroup
创建相应的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
时提供了Group
,它将创建一个UserGroup
,否则将不执行任何操作。当然,您同样可以在
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()