Rad*_*hiu 24 python django dictionary model save
我需要在模型的字段中保存字典.我怎么做?
例如,我有这个代码:
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()
如果还有什么我应该添加只是留下评论.谢谢!
ram*_*iro 21
我刚刚发现了django-jsonfield包,其中
是一个可重用的Django字段,允许您在模型中存储经过验证的JSON.
看起来是实现您想要的可行选择.
Ton*_*leh 10
在模型中存储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应用程序还有很多好东西,这是这个代码片段的来源.
Ric*_*ico 10
使用自定义字段类型是我的首选解决方案 - 我宁愿使用几行自定义代码,而不是支持单个字段类型的整个第三方库.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
可能最干净的事情是创建另一个"产品"表并具有多对多关系.(见这里:https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relationships.在文档中,他们使用披萨的例子,其中包含许多浇头.)
另一种选择是序列化您的bill_products.在这种情况下,你会做类似的事情:
bill_products = json.dumps([rand_products])
这将在for循环之外(尽管在上面的示例中,rand_products只是一个值,因此您需要修复它).
| 归档时间: | 
 | 
| 查看次数: | 38545 次 | 
| 最近记录: |