如何在Django模型中分配ModelFields?

时间:2016-09-27 06:20:21

标签: python django oop django-models

当我们在django中定义一个模型时,我们写了类似的东西。

class Student(models.Model):
    name = models.CharField(max_length=64)
    age = models.IntegerField()
    ...

其中,name = models.CharField()表示name将是models.CharField对象。当我们必须做一个学生的对象时,我们很简单。

my_name = "John Doe"
my_age = 18
s = Student.objects.create(name=my_name, age=my_age)

其中my_namemy_age分别是stringinteger数据类型,而不是models.CharField / models.IntegerField的对象。虽然在分配值时会执行相应的验证(例如,检查max_length上的CharField

我试图为Django上的Neo4j抽象构建类似的模型,但却无法获得这个工作流程。我该如何实现呢?

找到类似的question,但没有发现它有用。

1 个答案:

答案 0 :(得分:1)

工作原理

首先,我需要了解模型中的每个字段都有自己的验证,this one引用CharField(_check_max_length_attribute),并且它还调用super方法{{来自check类的1}}来验证一些基本的常见事物。

考虑到这一点,我们现在转向Field方法,这个方法要复杂得多,完全不同,特定对象的基本操作:

  1. 创建一个python对象
  2. 致电create
  3. 使用大量save() s保存会进行大量验证
  4. 如果数据库出现任何错误,请提交给数据库,将其提交给用户
  5. 您需要了解的第三件事是,当您查询对象时,它首先从数据库中获取数据,然后(在长时间处理之后)将数据设置为对象。

    简单示例

    getattr

    就像我们期待的那样:

    class BasicCharField: def __init__(self, max_len): self.max_len = max_len def validate(self, value): if value > self.max_len: raise ValueError('the value must be lower than {}'.format(self.max_len)) class BasicModel: score = BasicCharField(max_len=4) @staticmethod def create(**kwargs): obj = BasicModel() obj.score = kwargs['score'] obj.save() return obj def save(self): # Lots of validations here BasicModel.score.validate(self.score) # DB commit here BasicModel.create(score=5)

    显然我必须简化一些事情,使其成为几行代码,你可以通过很多方式改进这一点(比如遍历属性而不是像>>> ValueError: the value must be lower than 4那样硬编码)