通常情况下会比较好not将事物存储为数组。首先,并不是所有的数据库have数组,而且,它通常只会给(高效)查询带来更多麻烦,特别是如果数组中的元素refer到其他对象。您通常将多对关系存储在单独的表中。 Django 对此有支持:ManyToManyField[Django 文档].
此外,代码可能已经has一个问题:你存储users
as a CharField
。现在想象一下,用户更改了他们的用户名,那么这里就不再有链接了。如果你想引用(另一个)模型中的对象,你应该使用关系,比如ForeignKey
, OneToOneField
, or 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 = ManyToManyField(settings.AUTH_USER_MODEL)
好处是,我们不再需要关心 Django 如何(高效地)表示这一点,我们可以简单地获取所有User
s of a some_context
with 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"),
)
my_user = User.objects.get(username=user_request.get("user"))
conv.users.add(my_user)
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
conv.users.add(user_request.get("user"))
except Exception as e:
print("Context saving exception", e)
return HttpResponse(0)
return HttpResponse(1)