Python 如何在django中存储用户数组?
我有一个django模型,它基本上是一个名为Python 如何在django中存储用户数组?,python,django,Python,Django,我有一个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=F
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
字段中呢?通常最好不要将内容存储为数组。首先,并非所有数据库都有数组,而且,它通常只会给(高效)查询带来更多麻烦,特别是当数组中的元素引用其他对象时。通常将多个to关系存储在单独的表中。Django对此有支持:a
此外,代码可能已经存在问题:您将用户
存储为字符域
。现在假设一个用户更改了用户名,那么这里就不再有链接了。如果要引用(另一个)模型中的对象,应使用关系,如外键
、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 = ManyToManyField(settings.AUTH_USER_MODEL)
因此,我们可以获取用户,并将其添加到字段中。如果user\u 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)
@csrf\u豁免
def上下文_操作(请求):
user_request=json.load(request.body.decode('utf-8'))
如果request.method==“POST”:
尝试:
如果用户请求.get(“操作”)=“添加”:
打印(“添加”)
conv=Contexts.objects.create(
context\u name=user\u request.get(“context\u name”),
context\u description=user\u request.get(“context\u description”),
)
#如果user_request.get('user')包含用户模型的*主键*
conv.users.add(user\u request.get(“用户”))
例外情况除外,如e:
打印(“上下文保存异常”,e)
返回HttpResponse(0)
返回HttpResponse(1)
在这种情况下,您可以通过两种方式使用postgres json字段或使用django ManyToManyField,如下所示
from django.db import models
from django.contrib.postgres.fields import JSONField
# users field like below
users = JSONField()
or
users = models.ManyToManyField(User)
通常最好不要将对象存储为数组。首先,并非所有数据库都有数组,而且,它通常只会给(高效)查询带来更多麻烦。通常将多个to关系存储在单独的表中。Django对此有支持:aManyToManyField
。嘿,这很好。但问题是,由于某种原因,我无法在服务器上运行Django迁移。因此,除了Django模型之外,我还使用postgres。但我很难将相同的上下文
模型定义为postgres表。我在stackoverflow,但尚未取得任何成功。如果您能在这方面给出一些指导,那就太好了。(对你的答案投赞成票)顺便说一下,我使用了django的用户模型。“我不能在服务器上运行django迁移”=>那么这就是你应该解决的真正问题,而不是使用非标准的非正常“功能”。如果无法在生产服务器上运行迁移的原因是db管理员禁止迁移,那么您希望与他联系,讨论问题并了解如何进行所需的架构更改。我从来没有遇到过一个数据库管理员喜欢非规范化数据而不是干净的架构更改,特别是当架构更改只需要添加一个m2m表时,这实际上是无成本的。@SouvikRay:我认为最好先尝试(有效地)修复迁移问题,而不是尝试使用不同的列类型来“规避”问题。当然,它现在可能会起作用,但如果不解决“核心问题”,以后会造成很多问题。
from django.db import models
from django.contrib.postgres.fields import JSONField
# users field like below
users = JSONField()
or
users = models.ManyToManyField(User)