gpt4 book ai didi

django - 在 Django 中向多对多关系添加记录的正确方法

转载 作者:行者123 更新时间:2023-12-04 05:15:51 25 4
gpt4 key购买 nike

首先,我计划在谷歌应用引擎上运行我的项目,所以我使用 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 :

A Manager is the interface through which database query operations are provided to Django models

所以管理器不是创建模型新实例的方法。

我只需要一个 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 模型的构造函数中做类似的事情,这并不是那么重要,它只是取决于哪个比喻对您的代码有意义。

编辑:

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

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

关于django - 在 Django 中向多对多关系添加记录的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com