Python 如何在django中创建自定义模型字段,以及它是如何工作的

Python 如何在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

我是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)

此字段跟踪其他实体,这些实体在\u fields参数的
指定的字段上具有相同的值。当您保存具有此字段的模型的新实例时,它会在数据库中查找具有相同值的其他实体,这些值位于in
for_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)


现在,您可以根据“顺序”字段的值对具有相同过程的实体进行排序,并将它们放入创建顺序。

您是否尝试过自己运行它?