
[英]When Django models field is empty, set value to the Default value
[英]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"
FloatField
中使用max_length
; 它仅适用于CharField
等文本字段。FloatField
的默认值,因为FloatField
用于数字。 如果您想将某些内容标记为“卖家未指定”,我建议您不要定义默认值。 由于该字段为null=True
,因此只要您想将屏幕尺寸标记为“卖家未指定”,就可以使用None
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=True
和blank=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.