猿问

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

我很难在 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 一起工作 - 它将字符串传递给过滤器?或者只是一些缓存问题?


子衿沉夜
浏览 168回答 2
2回答

白衣非少年

在请求模型中,您需要修改“状态”的定义status = models.CharField(        max_length=31,        choices= RequestStatuses.choices(),        default=RequestStatuses.new.value    )然后您可以按照以下方式过滤。request = Request.objects.filter(status=RequestStatuses.new.name)

慕运维8079593

老实说,我不知道这样做的原因以及是否可以这样做,但是向枚举添加__repr__和__str__函数解决了这个问题。class RequestStatuses(Enum):    new = 'new'    sent = 'sent'    done = 'done'    def __repr__(self):        return self.name    def __str__(self):        return self.name
随时随地看视频慕课网APP

相关分类

Python
我要回答