当我们在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_name
和my_age
分别是string
和integer
数据类型,而不是models.CharField
/ models.IntegerField
的对象。虽然在分配值时会执行相应的验证(例如,检查max_length
上的CharField
)
我试图为Django上的Neo4j抽象构建类似的模型,但却无法获得这个工作流程。我该如何实现呢?
找到类似的question,但没有发现它有用。
答案 0 :(得分:1)
首先,我需要了解模型中的每个字段都有自己的验证,this one引用CharField(_check_max_length_attribute
),并且它还调用super
方法{{来自check
类的1}}来验证一些基本的常见事物。
考虑到这一点,我们现在转向Field
方法,这个方法要复杂得多,完全不同,特定对象的基本操作:
create
save()
s保存会进行大量验证您需要了解的第三件事是,当您查询对象时,它首先从数据库中获取数据,然后(在长时间处理之后)将数据设置为对象。
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
那样硬编码)