django-models - Django : How to make an unique, 空白模型。CharField?

标签 django-models unique

想象一下,我有一个模型来描述办公室拥有的打印机。他们可能准备好工作或不工作(可能在存储区或已购买但不在办公室......)。模型必须有一个字段来表示打印机的物理位置(“秘书办公室”、“接待处”……)。不能有两个重复的位置,如果它不起作用,它就不应该有一个位置。

我想要一个列表,其中显示所有打印机,并且每个打印机都有它所在的位置(如果有)。像这样的东西:

ID | Location
1  | "Secretary's office"
2  |
3  | "Reception"
4  | 

有了这个,我可以知道有两台打印机正在工作(1 和 3),而其他打印机处于离线状态(2 和 4)。

该模型的第一种方法应该是这样的:
class Printer(models.Model):
      brand = models.CharField( ...
      ...
      location = models.CharField( max_length=100, unique=True, blank=True )

但这不能正常工作。您只能在一个空白位置存储一个寄存器。它作为空字符串存储在数据库中,并且不允许您插入多次(数据库说该字段还有另一个空字符串)。如果向其中添加“null=True”参数,它的行为方式相同。这是因为,不是在相应的列中插入 NULL 值,而是默认值是一个空字符串。

在网上搜索我找到了http://www.maniacmartin.com/2010/12/21/unique-nullable-charfields-django/ ,试图以不同的方式解决问题。他说可能最干净的是最后一个,他将 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

这工作正常。您可以在没有位置的情况下存储多个寄存器,因为它不是插入空字符串,而是存储 NULL。这样做的问题是它显示了带有 Nones 而不是空字符串的空白位置。
ID | Location
1  | "Secretary's office"
2  | None
3  | "Reception"
4  | None

我认为有一个方法(或多个)必须在模型和数据库类管理器之间以两种方式(数据库到模型和模型到数据库)指定数据必须如何转换。

这是拥有独特的空白 CharField 的最佳方式吗?

谢谢,

最佳答案

尝试检查此线程。

Unique fields that allow nulls in Django

关于django-models - Django : How to make an unique, 空白模型。CharField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4838740/

相关文章:

python - 如何在 Django 中模拟一种方式的一对一关系

django - 删除了多少行?

python - 如何在Django中用 "SlugField()"增加 "unique=True"的大小?

mysql - 如何在多个表中实现唯一 ID

PHP 唯一数组值?

Django Rest Framework PUT请求对唯一模型字段

python - Django - 获取外键(相关)对象的列表

r - 是否有跨多列的 %in% 运算符

performance - 如果假设 1d 预排序向量,在 matlab 中实现 unique() 的更快方法?

java - 存储唯一整数的好方法