繁体   English   中英

如何在 django 模型中将字符串值设置为浮点字段的默认值

[英]how to set a string value as a default value of a float field in django models

我无法在 Django model 的浮点字段中将字符串值设置为默认值。 这是我的代码:

from django.db import models

class Product(models.Model):
    Name = models.CharField(max_length=700, null=True)
    Price = models.FloatField(null=True)
    Screen_size = models.FloatField(max_length=300, blank=True ,default="Not mentioned by the seller" , null=True)
    Focus_type = models.CharField(max_length=300, blank=True ,default="Not mentioned by the seller" , null=True)

当我尝试运行代码时,出现此错误:

ValueError: Field 'Screen_size' expected a number but got 'Not mentioned by the seller'.

这个默认值会保存到数据库中,而且很容易理解,字符串值不能保存到浮点字段中---数据库是静态类型的。

通常,如果你想做这样的事情,你应该使用property装饰器。

class Product(models.Model):
    Name = models.CharField(max_length=700, null=True)
    Price = models.FloatField(null=True)
    Screen_size = models.FloatField(blank=True ,null=True)
    Focus_type = models.CharField(max_length=300, blank=True ,default="Not mentioned by the seller" , null=True)

    @property
    def screen_size(self):
        if self.Screen_size is not None:
            return self.Screen_size
        return "Not mentioned by the seller"
  1. 您不能在FloatField中使用max_length 它仅适用于CharField等文本字段。
  2. 您不能将字符串设置为FloatField的默认值,因为FloatField用于数字。 如果您想将某些内容标记为“卖家未指定”,我建议您不要定义默认值。 由于该字段为null=True ,因此只要您想将屏幕尺寸标记为“卖家未指定”,就可以使用None
  3. 如果您需要None来做其他事情,您可以使用一个对屏幕尺寸没有意义的特殊值,例如-1 你可以定义
    SCREEN_SIZE_NOT_SPECIFIED_BY_SELLER = -1    

接着

    Screen_size = models.FloatField(max_length=300, blank=True ,default=SCREEN_SIZE_NOT_SPECIFIED_BY_SELLER , null=True)

编辑:Yang HG 的回答也不错; 但是如果您不打算使用_screen_size ,我会用Screen_Size替换它(并避免两个具有相同名称但大小写不同的变量)

我对 Django 具体了解不多,但根据我对一般软件/数据库设计的了解,我猜将消息作为任何字段的默认值提供是一个坏主意。

相反,我认为正确的方法是在浮点字段上使用null=Trueblank=True (正如你已经拥有的),允许“无值”表示为 null (即None )。 然后,无论在何处使用 model,您都可以将 null 值替换为您想要的任何消息(包括您可能想要用来指示该值缺失的任何特殊格式)。

对于字符串字段, 文档建议不要使用null=True :对于字符串,您应该只使用空字符串来表示“没有值”。

这种方法的一个明显好处是,字符串字段永远不会有等于默认消息的值的风险。 如果卖家输入“卖家未提及”作为Focus_type怎么办? 这个例子听起来很傻,但在其他情况下可能是个问题。


此外,作为 Python 的一般建议,通用约定是对变量名称 (like_this) 使用全小写字母和下划线,并且仅大写 class 名称(在 CamelCase 中)和常量(在 ALL_CAPS 中)。 Class 字段通常应大写为变量。 如果您想了解有关传统 Python 样式的更多信息,请查看PEP 8

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM