我在Django中使用枚举很难。
这是我的请求模型:
class RequestStatuses(Enum):
new = 'new'
sent = 'sent'
done = 'done'
class Request(BaseModel):
request_number = models.PositiveIntegerField(default=0)
type = models.CharField(max_length=31, blank=True, null=True)
status = models.CharField(
max_length=31,
choices=[(a.name, a.value) for a in RequestStatuses],
default=RequestStatuses.new
)
sensor = models.ForeignKey(Sensor, on_delete=models.SET_NULL, blank=True, null=True)
device = models.ForeignKey(Device, on_delete=models.SET_NULL, blank=True, null=True)
user = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)
payload = models.TextField(blank=True, null=True)
当我使用字符串或枚举类型创建记录时,会有所不同……
这很好用:
device = Device.objects.create(serial_number=1)
request = Request(
device=self.device,
status=RequestStatuses.sent
)
request.save()
try:
request = device.request_set.filter(
status=RequestStatuses.sent
)[0]
except IndexError:
print(device.request_set.all()[0].status)
pass
但这会引发异常
device = Device.objects.create(serial_number=1)
request = Request(
device=device,
status='sent'
)
request.save()
try:
request = device.request_set.filter(
status=RequestStatuses.sent
)[0]
except IndexError:
print(device.request_set.all()[0].status)
pass
当我尝试使用status=RequestStatuses.sent.value
或仅使用sent
字符串进行过滤时,第一个示例将引发异常,第二个示例将起作用。
当您无法按字符串过滤或相反时,枚举有什么意义呢?如何使用api-它将字符串传递给过滤器?还是仅仅是一些缓存问题?
答案 0 :(得分:0)
老实说,我不知道这样做的原因以及是否可以这样做,但是在枚举中添加__repr__
和__str__
函数可以解决此问题。
class RequestStatuses(Enum):
new = 'new'
sent = 'sent'
done = 'done'
def __repr__(self):
return self.name
def __str__(self):
return self.name
答案 1 :(得分:0)
在请求模型中,您需要修改“状态”的定义
status = models.CharField(
max_length=31,
choices= RequestStatuses.choices(),
default=RequestStatuses.new.value
)
然后您可以按照以下方式进行过滤。
request = Request.objects.filter(status=RequestStatuses.new.name)