我在django模型中使用枚举,例如:
class AwesomeNess(Enum):
slight = "SLIGHT"
very = "VERY"
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
awesomeness = models.CharField(
max_length=255,
choices=[(tag.value, tag.name) for tag in AwesomeNess],
default=AwesomeNess.slight
)
当我使用Django的filter函数时,这个工作得很好,例如:
d = Choice.objects.filter(awesomeness=AwesomeNess.slight)
但如果我这样做,它就不能工作:
choice_obj = Choice.objects.get(id=1)
choice_obj.awesomeness == AwesomeNess.slight # will return False
choice_obj.awesomeness == "AwesomeNess.slight" # will return True
由于值以字符串形式存储,因此在返回数据时,Django看起来忘记将它们强制转换回枚举。
这会导致编码时出现不一致性,因为django模型过滤器可以查询枚举,而属性平等过滤需要我使用枚举的字符串表示。
编辑:枚举是从另一个模型类导入的,因此无法用Django内置的choices类替换它。
编辑2:在调查此问题时,我也注意到以下情况:
myobj = Choice.objects.get(id=1)
myobj.awesomeness # <<-- string type
myobj.awesomeness = AwesomeNess.very <<-- object changes type to enum
myobj.save()
myobj2 = Choice.objects.get(id=1) <<-- upon reload from db, the updated value is returned as string
作为一个初学 Django 的用户,这对我来说似乎非常危险,而且在我阅读的任何“如何在 Django 中使用枚举”的文章中都没有提到。这仅仅是因为我使用的 Django 版本太旧了吗?
有没有什么方法可以解决这个问题?我做错了什么吗?谢谢!顺便说一下:这是在 Django 2.2.24 上。也许更新版本的枚举支持更好了吗?