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

时间:2019-03-29 09:54:20

标签: python django enums

我在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 个答案:

答案 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)