[英]Hardcoding attributes in django models
好的,这是在我看来很有意义但很难正确解释的问题之一:)我有一个django应用程序,我想在其中存储许多不同设备项的记录。 每种类型的设备都有一个自定义模型来存储其属性,例如下面的MyEquipment
。 每种类型的设备还将有一个“类别”,将其存储为属性非常有用。
class Category(models.Model):
code = models.CharField('Category', max_length=4, unique=True)
description = models.CharField('Description', max_length=30)
...
class MyEquipment(models.Model):
serial = models.IntegerField()
...
要将这个属性保存到我的模型中,我可以对Category
使用外键,但是我不需要,因为MyEquipment
每个记录MyEquipment
必须是相同的Category
。 所以我想也许我可以像这样在MyEquipment
元数据中对Category
进行硬编码:
class MyEquipment(models.Model):
serial = models.IntegerField()
...
class Meta:
category = Category.objects.get(code='EC')
但这将依赖于用数据填充的Category
模型来构建MyEquipment
模型。 对我来说,这似乎不是最佳实践,它使用可能存在或可能不存在的数据来定义另一个模型的结构。 我应该使用一种更好的方法来设置MyEquipment
模型与哪个Category
相关吗?
编辑
感谢下面的讨论,这让我意识到也许我对自己的原始帖子不清楚。 因此,我想做的就是将MyEquipment
链接到Category
。 所以我可以做这样的事情:
>>> from myapp.models import MyEquipment
>>> MyEquipment.CATEGORY
<Category: EC>
我想将整个模型链接到Category
,因此我可以根据视图的类别以不同的方式处理每个模型。 考虑了更多问题后,我可以通过编写MyEquipment
来获得此功能,如下所示:
class MyEquipment(models.Model):
CATEGORY = Category.objects.get(code='EC')
serial = models.IntegerField()
...
这种方法有效,但这是最好的方法吗? 我想每次实例化该类时,模型都会执行此操作? 有没有更有效的方法?
无论如何,您无法执行此操作; Meta类不支持任意属性。
最好的办法是将其定义为属性,您可以通过实例本身访问该属性。 为了提高效率,您可以在课堂上记住它。
@property
def category(self):
_category = getattr(self, '_category', None)
if not _category:
self.__class__._category = _category = Category.objects.get(code='EC')
return _category
but ... every record in MyEquipment must be the same Category
然后,您不需要任何关系。 正如您已经说过的,MyEquipment中的每个记录都是相同的Category,为什么要在db中存储关系?
UPD:具有模型继承的解决方案
class Place(models.Model):
category = models.ForeignKey(Category)
class Meta:
abstract = True
def save(self, *args, **kwargs):
self.category = Category.objects.get(name=self.CATEGORY)
return super(Place, self).save(*args, **kwargs)
class Restaurant(Place):
...fields...
CATEGORY = 'RE'
class Building(Place):
...fields...
CATEGORY = 'BU'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.