繁体   English   中英

Django模型中的硬编码属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM