- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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)
目前每个 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/
我是一名优秀的程序员,十分优秀!