我很难在 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 一起工作 - 它将字符串传递给过滤器?或者只是一些缓存问题?
2 回答
白衣非少年
TA贡献1155条经验 获得超0个赞
在请求模型中,您需要修改“状态”的定义
status = models.CharField(
max_length=31,
choices= RequestStatuses.choices(),
default=RequestStatuses.new.value
)
然后您可以按照以下方式过滤。
request = Request.objects.filter(status=RequestStatuses.new.name)
慕运维8079593
TA贡献1876条经验 获得超5个赞
老实说,我不知道这样做的原因以及是否可以这样做,但是向枚举添加__repr__和__str__函数解决了这个问题。
class RequestStatuses(Enum):
new = 'new'
sent = 'sent'
done = 'done'
def __repr__(self):
return self.name
def __str__(self):
return self.name
添加回答
举报
0/150
提交
取消