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类。这一部分在我的例子中得到了解决,但我想将空数据转换为空字符串,而不是无。