为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用枚举或字符串过滤并获得相同的结果?

如何使用枚举或字符串过滤并获得相同的结果?

子衿沉夜 2021-12-21 16:49:04
我很难在 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)


查看完整回答
反对 回复 2021-12-21
?
慕运维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


查看完整回答
反对 回复 2021-12-21
  • 2 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信