Django models Django:如何制作独特的空白模型。CharField?
想象一下,我有一个模型来描述办公室拥有的打印机。他们可以准备好工作,也可以不工作(可能在储藏区,或者已经买了,但不在办公室…)。模型必须有一个表示打印机物理位置的字段(“秘书办公室”、“接待处”…)。不能有两个重复的位置,如果不工作,则不应有位置 我想有一个列表,其中所有的打印机出现,并为每一个有它的位置(如果有)。大概是这样的:Django models Django:如何制作独特的空白模型。CharField?,django-models,unique,Django Models,Unique,想象一下,我有一个模型来描述办公室拥有的打印机。他们可以准备好工作,也可以不工作(可能在储藏区,或者已经买了,但不在办公室…)。模型必须有一个表示打印机物理位置的字段(“秘书办公室”、“接待处”…)。不能有两个重复的位置,如果不工作,则不应有位置 我想有一个列表,其中所有的打印机出现,并为每一个有它的位置(如果有)。大概是这样的: ID | Location 1 | "Secretary's office" 2 | 3 | "Reception" 4 | class Printer(
ID | Location
1 | "Secretary's office"
2 |
3 | "Reception"
4 |
class Printer(models.Model):
brand = models.CharField( ...
...
location = models.CharField( max_length=100, unique=True, blank=True )
有了这一点,我可以知道有两台打印机正在工作(1和3),其他打印机正在脱机(2和4)
模型的第一种方法应该是这样的:
ID | Location
1 | "Secretary's office"
2 |
3 | "Reception"
4 |
class Printer(models.Model):
brand = models.CharField( ...
...
location = models.CharField( max_length=100, unique=True, blank=True )
但这不能正常工作。只能在一个空白位置存储一个寄存器。它作为空字符串存储在数据库中,并且不允许您多次插入(数据库表示该字段还有另一个空字符串)。如果添加“null=True”参数,则其行为方式相同。这是因为,默认值是空字符串,而不是在相应列中插入NULL值
在网上搜索,我发现,这试图以不同的方式解决问题。他说,可能最干净的是最后一个,在这个例子中,他对CharField类进行了子类化,并重写了一些方法来在数据库中存储不同的值。代码如下:
from django.db import models
class NullableCharField(models.CharField):
description = "CharField that obeys null=True"
def to_python(self, value):
if isinstance(value, models.CharField):
return value
return value or ""
def get_db_prep_value(self, value):
return value or None
这个很好用。您可以无位置地存储多个寄存器,因为它存储的不是空字符串,而是空字符串。问题在于它用NOES而不是空字符串来显示空白位置。
ID | Location
1 | "Secretary's office"
2 | None
3 | "Reception"
4 | None
我假设有一个方法(或多个方法),其中必须指定必须如何在模型和数据库类管理器之间以两种方式(数据库到模型和模型到数据库)转换数据
这是拥有唯一的空白字符域的最佳方式吗
谢谢,尝试检查此线程
您可以使用模型方法以自定义方式输出值 如下所示(在模型类中):
def位置_输出(自身):
“返回位置并用空字符串替换无值”
如果自行选择位置:
返回自我定位
其他:
返回“”
然后您可以在这样的视图中使用它
打印机.对象.创建(location=“location 1”)
>>>Printer.objects.create(位置=无)
>>>Printer.objects.get(id=1).location\u output()
“位置1”
>>>Printer.objects.get(id=2).location\u output()
''
在你的模板中,像这样
{{printer.location\u output}
讨论了如何在数据库中存储空字符串而不是空字符串。它们使用一些解决方案,如重写模型的save方法或子类CharField类。这一部分在我的例子中得到了解决,但我想将空数据转换为空字符串,而不是无。