我有一个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追加到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
字段中(假设传递了相同的上下文名称)?
2条答案
按热度按时间hvvq6cgz1#
通常情况下,最好不要将数据存储为数组。首先,并不是所有的数据库都有数组,而且,它通常只会给(高效)查询带来更多麻烦,特别是当数组中的元素引用其他对象时。你通常将多个to关系存储在一个单独的表中。Django支持这一点:a**
ManyToManyField
**[Django-doc].此外,代码可能已经有了一个问题:你将
users
存储为CharField
。现在假设用户更改了他们的用户名,那么这里就不再有链接了。如果你想引用(另一个)模型中的对象,你应该使用关系,比如ForeignKey
,OneToOneField
或ManyToManyField
。所以我们可以把它改写为:
好的一面是,我们不再需要关心Django如何(有效地)表示这一点,我们可以简单地用
some_context.users.all()
获得some_context
的所有User
。这些就是User
对象(或者其他模型对象,如果你稍后更改用户模型)。然后我们可以将
User
添加到对象中,如下所示:所以我们可以获取用户,并将其添加到字段中。如果
user_request.get('user')
包含用户的 * 主键 *,我们甚至可以省略获取User
对象,并用途:bwitn5fc2#
在这种情况下,你可以使用两种方法,要么使用postgres json字段,要么使用django ManyToManyField,如下所示: