python - 如何在django中存储用户数组?

标签 python django

我有一个 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)

目前每个上下文只有一个用户。但我想将更多用户添加到同一个上下文。所以现在我想更改用户 字段到数组字段。顺便说一句,我正在使用 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 如何(高效地)表示它,我们可以简单地获取所有 Usersome_contextsome_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/

相关文章:

python:压缩csv缓冲区

python - 在列表列表中绘制点的快速方法

python - 读取并预处理 tensorflow 预训练模型的图像

python - 查找唯一列和列成员

Django:ModelViewSet 路由器不适用于更新操作

java - 如何将 Java 类与 Python 集成?

python - 如何停止由于输入错误而运行的代码而不导致 GUI 崩溃

python - 如何使用 python 2.7 将多个 csv 列合并为一列?

python - 如何计算一页的多个实例的总值

python - TypeError : expected str,字节或os.PathLike对象,不是Django中的元组