gpt4 book ai didi

python - 如何在 Django 中存储一组用户?

转载 作者:行者123 更新时间:2023-11-28 22:16:51 25 4
gpt4 key购买 nike

我有一个 django 模型,它基本上是一个名为 Contexts 的组。它包含一些字段,例如 namedescription 和一个用户。下面模型是否定义

class Contexts(models.Model):
context_name = models.CharField(max_length=50)
context_description = models.TextField()
users = models.CharField(max_length=255, null=False)

目前每个 Context 只有一个用户。但是我想将更多用户添加到同一个 Context。所以现在我想更改 users 字段到数组字段。顺便说一句,我使用的是 django + postgres。

我就是这样做的

class Contexts(models.Model):
context_name = models.CharField(max_length=50)
context_description = models.TextField()
users = ArrayField(ArrayField(models.TextField()))

但是我如何将用户附加到 users 字段?这就是我添加上下文的通常做法

@csrf_exempt
def context_operation(request):
user_request = json.loads(request.body.decode('utf-8'))
if request.method == "POST":
try:
if user_request.get("action") == "add":
print("add")
conv = Contexts.objects.create(
context_name=user_request.get("context_name"),
context_description=user_request.get("context_description"),
users=user_request.get("user")
)

except Exception as e:
print("Context saving exception", e)
return HttpResponse(0)
return HttpResponse(1)

但是我如何一次将一个用户附加到同一上下文中的 users 字段(假设传递了相同的上下文名称)?

最佳答案

通常不要将事物存储为数组会更好。首先,并不是所有的数据库都有数组,此外,它通常只会给(高效)查询带来更多麻烦,尤其是当数组中的元素引用其他对象。您通常将多对关系存储在单独的表中。 Django 对此有支持:a ManyToManyField [Django-doc] .

此外,代码可能已经了一个问题:你存储users作为 CharField .现在假设用户更改了他们的用户名,那么这里不再有链接。如果你想引用(另一个)模型中的对象,你应该使用关系,比如 ForeignKey , OneToOneField , 或 ManyToManyField .

所以我们可以将其重写为:

from django.db import models
from django.conf import settings

class Contexts(models.Model):
context_name = models.CharField(max_length=50)
context_description = models.TextField()
users = <b>ManyToManyField(settings.AUTH_USER_MODEL)</b>

好消息是,我们不再需要关心 Django 如何(有效地)表示它,我们可以简单地获取所有 User some_context的小号与 some_context.users.all() .然后是User对象(或其他模型对象,如果您稍后更改用户模型)。

然后我们可以添加 User对象如下:

@csrf_exempt
def context_operation(request):
user_request = json.loads(request.body.decode('utf-8'))
if request.method == "POST":
try:
if user_request.get("action") == "add":
print("add")
conv = Contexts.objects.create(
context_name=user_request.get("context_name"),
context_description=user_request.get("context_description"),
)
<b>my_user = User.objects.get(username=user_request.get("user"))</b>
<b>conv.users.add(my_user)</b>

except Exception as e:
print("Context saving exception", e)
return HttpResponse(0)
return HttpResponse(1)

所以我们可以获取用户,并将其添加到字段中。如果你user_request.get('user')包含用户的主键,我们甚至可以省略获取 User对象,并使用:

@csrf_exempt
def context_operation(request):
user_request = json.loads(request.body.decode('utf-8'))
if request.method == "POST":
try:
if user_request.get("action") == "add":
print("add")
conv = Contexts.objects.create(
context_name=user_request.get("context_name"),
context_description=user_request.get("context_description"),
)
# if user_request.get('user') contains the *primary* key of the User model
<b>conv.users.add(user_request.get("user"))</b>

except Exception as e:
print("Context saving exception", e)
return HttpResponse(0)
return HttpResponse(1)

关于python - 如何在 Django 中存储一组用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893225/

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