Python 如何在django中创建自定义模型字段,以及它是如何工作的
我是django开发的新手,我知道并一直使用django提供的默认模型字段,但在阅读一本书时,我偶然发现了下面给出的代码,并且知道django有自定义模型字段,有人能告诉我下面的代码做了什么吗。 谢谢你的回复 Models.pyPython 如何在django中创建自定义模型字段,以及它是如何工作的,python,django,Python,Django,我是django开发的新手,我知道并一直使用django提供的默认模型字段,但在阅读一本书时,我偶然发现了下面给出的代码,并且知道django有自定义模型字段,有人能告诉我下面的代码做了什么吗。 谢谢你的回复 Models.py class Module(models.Model): course = models.ForeignKey(Course, related_name='modules') title = models.CharField(max_length=200) d
class Module(models.Model):
course = models.ForeignKey(Course, related_name='modules')
title = models.CharField(max_length=200)
description = models.TextField(blank=True)
order = OrderField(blank=True, for_fields=['course'])
fields.py
class OrderField(models.PositiveIntegerField):
def __init__(self, for_fields=None, *args, **kwargs):
self.for_fields = for_fields
super(OrderField, self).__init__(*args, **kwargs)
def pre_save(self, model_instance, add):
if getattr(model_instance, self.attname) is None:
# no current value
try:
qs = self.model.objects.all()
if self.for_fields:
query = {field: getattr(model_instance, field) for field in self.for_fields}
qs = qs.filter(**query)
last_item = qs.latest(self.attname)
value = last_item.order + 1
except ObjectDoesNotExist:
value = 0
setattr(model_instance, self.attname, value)
return value
else:
return super(OrderField,self).pre_save(model_instance, add)
此字段跟踪其他实体,这些实体在\u fields参数的
指定的字段上具有相同的值。当您保存具有此字段的模型的新实例时,它会在数据库中查找具有相同值的其他实体,这些值位于infor_fields
定义的字段中,并将这些实体的数量加上一存储在order字段中
我想,如果您有一个实体表,希望向用户显示,您可以根据顺序
值,按创建/更新顺序对这些字段中具有相同值的实体进行排序
示例:
假设您的数据库中已经有三门课程,ID为[1,2,3]
现在,您可以创建引用这些课程之一的新模块
Module(course_id=1, title='First').save() # No 1
Module(course_id=2, title='Second').save() # No 2
Module(course_id=1, title='Third').save() # No 3
Module(course_id=1, title='Fourth').save() # No 4
您的4个新模块现在在订单字段中具有以下值:
编号1:0(课程1中没有其他模块)
No 2:0(课程2没有其他模块)
编号3:1(课程1的另一个模块)
No 4:2(另外两个模块已经参考了课程1)
现在,您可以根据“顺序”字段的值对具有相同过程的实体进行排序,并将它们放入创建顺序。您是否尝试过自己运行它?