我有一个Django模型,其中有很多字段可以选择。所以我不得不写很多类的“is_nusomething”属性来检查实例值是否等于某个choice值。大致如下:
class MyModel(models.Model):
some_choicefield = models.IntegerField(choices=SOME_CHOICES)
@property
def is_some_value(self):
return self.some_choicefield == SOME_CHOICES.SOME_CHOICE_VALUE
# a lot of these...
在我的实例中,我用大量的多余的方法来自动执行这些检查。 代码如下(我假设有一个“normalize”函数,它使所选的标签成为可用的函数名):
^{pr2}$现在,这是可行的,但我觉得还有更好的方法。可能在类创建时(使用元类或在新的方法中)?你对此有什么想法/建议吗?在
好吧,我不知道如何用你的方式来做,但在这种情况下,我认为方法是简单地创建一个新的模型,在那里你保留你的选择,并将字段改为ForeignKey。这更易于编码和管理。在
您可以在Django docs: Models: Relationships中找到许多基本级别的信息。在那里,有许多链接可以在各种主题上展开。除此之外,我相信这只需要一点想象力,也许一开始就需要试错。在
我遇到了一个类似的问题,我需要在运行时编写大量的属性,以便在更改模型字段时提供向后兼容性。有两种标准的处理方法-
我打赌你知道Django字段中提供的选项将自动具有显示功能。在
假设您有一个定义如下的字段:
您只需调用一个名为
get_category_display()
的函数来访问显示值。以下是此功能的Django源代码:https://github.com/django/django/blob/baff4dd37dabfef1ff939513fa45124382b57bf8/django/db/models/base.py#L962
https://github.com/django/django/blob/baff4dd37dabfef1ff939513fa45124382b57bf8/django/db/models/fields/init.py#L704
所以我们可以按照这个方法来实现我们的
dynamically set property
目标。在这是我的设想,与你的有点不同,但到最后都是一样的:
我有两个类,},如果缓存未命中,则回退到数据库:
Course
和Lesson
,类Lesson
有一个ForeignKey字段Course
,我想向类cached_course
添加一个属性名Lesson
,该类将首先从缓存中获取{下面是一个典型的解决方案:
^{pr2}$原来我有这么多ForeignKey字段要缓存,所以下面的代码与Django get_FIELD_display特性类似:
通过定制
CachedForeignKeyField
,并用_cached_FIELD
方法覆盖contribute_to_class
方法以及BaseModel
类,每个CachedForeignKeyField
将自动相应地具有一个cached_FIELD
属性。在太好了,太棒了!在
相关问题 更多 >
编程相关推荐