我无法在ArrayField中存储字符串。当我试图在其中保存某些内容时,不会抛出异常,但是数组仍然是空的。
下面是models.py中的一些代码:
# models.py
from django.db import models
import uuid
from django.contrib.auth.models import User
from django.contrib.postgres.fields import JSONField, ArrayField
# Create your models here.
class UserDetail(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
key = models.CharField(max_length=50, default=False, primary_key=True)
api_secret = models.CharField(max_length=50)
user_categories = ArrayField(models.CharField(max_length = 1000), default = list)
def __str__(self):
return self.key
class PreParentProduct(models.Model):
product_user = models.ForeignKey(UserDetail, default=False, on_delete=models.CASCADE)
product_url = models.URLField(max_length = 1000)
pre_product_title = models.CharField(max_length=600)
pre_product_description = models.CharField(max_length=2000)
pre_product_variants_data = JSONField(blank=True, null=True)
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
def __str__(self):
return self.pre_product_title
我试着这样保存它:
catlist = ast.literal_eval(res.text)
for jsonitem in catlist:
key = jsonitem.get('name')
id = jsonitem.get("id")
dictionary = {}
dictionary['name'] = key
dictionary['id'] = id
tba = json.dumps(dictionary)
print("It works till here.")
print(type(tba))
usersearch[0].user_categories.append(tba)
print(usersearch[0].user_categories)
usersearch[0].save()
print(usersearch[0].user_categories)
我得到的结果是:
It works till here.
<class 'str'>
[]
It works till here.
<class 'str'>
[]
[]
这是在ArrayField中存储字符串的正确方法吗?
我不能将JSONField存储在ArrayField中,所以必须将其转换为字符串。
我该怎么解决?
最佳答案
附加问题的解决方案。
你还没有证明你的usersearch[0]
我怀疑是这样的:
usersearch = UserDetail.objects.all()
如果是这样,那么您正在对结果集进行更改,这些内容是不可变的。尝试此操作,您将看到该id也未更改:
usersearch[0].id = 1000
print usersearch.id
但这行得通
usersearch = list(UserDetail.objects.all())
我也是
u = usersearch[0]
解决实际问题
user_categories = ArrayField(models.CharField(max_length = 1000), default = list)
这是错误的。ArrayFields不应该以这种方式使用。你很快就会发现你需要搜索它们
数组不是集合;搜索特定数组元素可以是
数据库设计错误的迹象。考虑对行使用单独的表
对于每个将成为数组元素的项。这样会更容易
搜索,并可能更好地扩展大量元素
参考:https://www.postgresql.org/docs/9.5/static/arrays.html
你需要规范化你的数据。您需要有一个类别模型,并且您的UserDetail应该通过外键与之相关。