我是django开发的新手,我知道并且总是使用django提供的默认模型字段,但在阅读一本书时我遇到了下面给出的代码并且知道django有自定义模型字段,有人可以让我知道下面代码的作用。 谢谢你的回复。
Models.py
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)
答案 0 :(得分:1)
此字段跟踪for_fields
参数指定的字段上具有相同值的其他实体。当您保存具有此字段的模型的新实例时,它会在for_fields
定义的字段中查找数据库中具有相同值的其他实体,并在订单字段中存储这些实体的数量加一。 / p>
我想如果你有例如要向用户显示的实体表,您可以按照创建/更新的顺序对这些字段中具有相同值的实体进行排序,具体取决于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没有其他模块)
No 3:1(课程1的另一个模块)
No 4:2(另外两个模块已经引用了课程1)
现在,您可以按照订单字段的值对具有相同课程的实体进行排序,将它们按照创建顺序排列。