首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Django数据库模型的字段中存储字典

如何在Django数据库模型的字段中存储字典
EN

Stack Overflow用户
提问于 2012-03-13 22:49:02
回答 8查看 46.3K关注 0票数 25

我需要在模型的字段中保存一个字典。我该怎么做?

例如,我有这样的代码:

def create_random_bill(self):
    name_chars = re.compile("[a-zA-Z0-9 -_]")
    bill_name = "".join(random.choice(name_chars for x in range(10)))
    rand_products = random.randint(1,100)
    for x in rand_products:
        bill_products = 
    new_bill = Bill.new(name=bill_name, date=datetime.date, products=bill_products)
    new_bill.save()

我应该为"bill_products=“写些什么,这样它就可以保存一些随机的产品,从我的产品型号到这个账单?

这是账单的模型描述:

class Bill(models.Model):
    name = models.CharField(max_length=255)
    date = models.DateTimeField(auto_now_add=True)
    products = models.ManyToManyField(Product, related_name="bills")

以及产品的型号描述:

class Product(models.Model):
    name = models.CharField(max_length=255)
    price = models.IntegerField()

如果还有什么我应该添加的,请留下评论。谢谢!

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-03-13 23:12:31

也许最干净的做法是创建另一个"Products“表,并具有多对多关系。(请看这里:https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships。在文档中,他们使用了比萨饼有很多配料的例子。)

另一种选择是序列化bill_products。在这种情况下,您应该这样做:

bill_products = json.dumps([rand_products])

这将在for循环之外(尽管在上面的示例中,rand_products只是一个值,因此您需要修复它)。

票数 6
EN

Stack Overflow用户

发布于 2012-03-14 04:40:37

在模型中存储JSON表示的一种方便方法是使用自定义字段类型:

class JSONField(models.TextField):
    """
    JSONField is a generic textfield that neatly serializes/unserializes
    JSON objects seamlessly.
    Django snippet #1478

    example:
        class Page(models.Model):
            data = JSONField(blank=True, null=True)


        page = Page.objects.get(pk=5)
        page.data = {'title': 'test', 'type': 3}
        page.save()
    """

    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        if value == "":
            return None

        try:
            if isinstance(value, basestring):
                return json.loads(value)
        except ValueError:
            pass
        return value

    def get_db_prep_save(self, value, *args, **kwargs):
        if value == "":
            return None
        if isinstance(value, dict):
            value = json.dumps(value, cls=DjangoJSONEncoder)
        return super(JSONField, self).get_db_prep_save(value, *args, **kwargs)

我将这个utils/fields.py保存在我的模型from utils.fields import JSONField中。在django-annoying应用程序中还有更多的好东西,这就是这个代码片段的来源。

票数 10
EN

Stack Overflow用户

发布于 2017-01-25 05:07:46

使用自定义字段类型是我的首选解决方案--我宁愿有几行自定义代码,也不愿为一个字段类型支持整个第三方库。Tony Abou-Assaleh有一个很好的解决方案,但不适用于更新版本的Django。

这已被验证可以与Django 1.10.4一起使用

import json

from django.db import models
from django.core.serializers.json import DjangoJSONEncoder


class JSONField(models.TextField):
    """
    JSONField is a generic textfield that neatly serializes/unserializes
    JSON objects seamlessly.
    Django snippet #1478

    example:
        class Page(models.Model):
            data = JSONField(blank=True, null=True)


        page = Page.objects.get(pk=5)
        page.data = {'title': 'test', 'type': 3}
        page.save()
    """

    def to_python(self, value):
        if value == "":
            return None

        try:
            if isinstance(value, str):
                return json.loads(value)
        except ValueError:
            pass
        return value

    def from_db_value(self, value, *args):
        return self.to_python(value)

    def get_db_prep_save(self, value, *args, **kwargs):
        if value == "":
            return None
        if isinstance(value, dict):
            value = json.dumps(value, cls=DjangoJSONEncoder)
        return value
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9686409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档