我无法在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应该通过外键与之相关。

10-05 19:27