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

时间:2017-01-28 19:36:13

标签: python django

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

1 个答案:

答案 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)

现在,您可以按照订单字段的值对具有相同课程的实体进行排序,将它们按照创建顺序排列。