如何在ArrayField中存储字符串? (Django和PostgreSQL)

时间:2016-08-17 11:06:15

标签: python django postgresql

我无法在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'>
[]
[]

这是在StringField中存储字符串的正确方法吗? 我无法将JSONField存储在ArrayField中,因此我必须将其转换为字符串。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

追加问题的解决方案。

你还没有证明你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应该通过外键与它相关。