在Django中排序ForiegnKey对象

时间:2017-02-07 21:59:22

标签: python django django-models

我有一个有两个主要类的模型。

第一个是书籍模型,第二个是页面模型

这些页面有一个外键字段,可以让我访问它们,但我很好奇的是,你如何实现页码,这样在创建一个新的页面对象时,这个数字仅限于当前的页面长度?此外,如果插入,如何将后续页面向下移动一个?

现在我只有一个整数字段,我手动输入页码,但如果我想让用户以后自己添加页面,那就不行了。

更新:

class Textbook(models.Model):
    founder = models.CharField(max_length=256)
    title = models.CharField(max_length=256)
    cover = models.ImageField(upload_to=get_image_path, 
                              blank=True, 
                              null=True)

    def __str__(self):
        return self.title


class Page(models.Model):
    textbook = models.ForeignKey(Textbook, related_name="pages")
    page_title = models.CharField(max_length = 256)

    def __str__(self):
        return self.page_title


class Section(models.Model):
    page = models.ForeignKey(Page,related_name="sections")
    section_title = models.CharField(max_length=256)
    text = RichTextField(config_name='awesome_ckeditor')

    def __str__(self):
        return self.section_title

所以上面是我的模型,我要做的是使它能够按顺序跟踪TextBook中包含的页面。此外,您可以插入新页面,页码也会相应更改。因此,如果您说有1,2,3页并希望添加新页面,则可以添加新页面作为第4页,或者将其插入2到3之间,之前的页面3将成为第4页。

2 个答案:

答案 0 :(得分:1)

'order_with_respect'选项是否是你问题的答案:

https://docs.djangoproject.com/en/1.10/ref/models/options/#order-with-respect-to

答案 1 :(得分:0)

这是我很久以前提出的一个相当即兴的解决方案,但你可能会试一试。你可以做的是使用CharField

例如,您有一本包含以下页面的书:

1 1.1 2 2.1 2.11 2.111 3 4 5 6 7 8.11

当您在书中插入新页面时,只需在页码或小数字段的末尾添加另一个1即可。然后你可以偶尔运行一个维护任务,只需将所有数字清理回1 2 3 4,这样你就可以经常丢弃额外的小数。

您可以查看以下python代码:

In [2]: l
Out[2]: ['1', '2', '3', '4', '4.1', '4.11', '4.11', '5', '6', '1.1']

In [3]: sorted(l)
Out[3]: ['1', '1.1', '2', '3', '4', '4.1', '4.11', '4.11', '5', '6']

In [4]: l.append('5.1')

In [5]: sorted(l)
Out[5]: ['1', '1.1', '2', '3', '4', '4.1', '4.11', '4.11', '5', '5.1', '6']

您可以使用django management command创建例行任务,在后台每隔一段时间运行一次。