我有一个 django 模型,它基本上是一个名为 Contexts
的组。它包含一些字段,例如 name
、description
和用户。如下是模型定义的
class Contexts(models.Model):
context_name = models.CharField(max_length=50)
context_description = models.TextField()
users = models.CharField(max_length=255, null=False)
目前每个上下文
只有一个用户。但我想将更多用户添加到同一个上下文
。所以现在我想更改用户
字段到数组字段。顺便说一句,我正在使用 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/