sam*_*per 5 refactoring dry django-models
我想确保一个对象是唯一的,并在用户试图保存时抛出错误(例如通过管理员),如果没有?通过唯一,我的意思是某些对象的属性可能与其他对象的属性保持相同的值,但它们不能与另一个对象的值相同.
如果我没弄错的话,我可以这样做:
class Animal(models.Model):
common_name = models.CharField(max_length=150)
latin_name = models.CharField(max_length=150)
class Meta:
unique_together = ("common_name", "latin_name")
Run Code Online (Sandbox Code Playgroud)
但是每次我重构模型(例如添加新字段,或更改现有字段的名称)时,我还必须编辑分配给unique_together的括号中的字段列表.使用一个简单的模型,没关系,但是如果使用一个实体模型,它在重构过程中会变得非常麻烦.
如何避免在unique_together括号中重复输入字段名称列表?有没有办法将模型的字段列表传递给变量并将该变量分配给unique_together?
重构模型是一件相当昂贵的事情:
因此,我认为更新模型元类中唯一字段名称的列表是您最不应该担心的问题。
编辑:如果你真的想这样做,并且你的所有字段都必须“唯一”,那么 freenode 的人是对的,你必须编写一个自定义元类。这是相当复杂且容易出错的,而且它可能会使您的代码与 Django 的未来版本不兼容。
Django 的 ORM“魔力”是由通用基类的元类ModelBase
( metaclass) 控制的。该类负责获取包含所有字段和元信息的类定义,并构造稍后将在代码中使用的类。django.db.models.base.ModelBase
Model
以下是如何实现目标的秘诀:
ModelBase
以使用您自己的元类。__new__(cls, name, bases, dict)
dict
收集Meta
成员(dict["Meta"]
)以及所有现场成员meta.unique_together
根据您收集的字段名称进行设置。ModelBase.__new__
)__metaclass__ = MyMetaclass
(或派生扩展Model
和重写元类的抽象基类) 归档时间: |
|
查看次数: |
717 次 |
最近记录: |