Django:我怎样才能为多对多关系增加重量/排序?

时间:2010-06-17 20:50:50

标签: django django-models

我正在使用带有TextBlocks的Pages。文本块可能出现在不同的页面上,页面上可能有几个文本块。每个页面都可以按照自己的顺序排列这些块。  这可以通过使用单独的参数来解决。像这样:

class TextBlock(models.Model):
    title = models.CharField(max_length=255)
    text = models.TextField()

class Page(models.Model):
    textblocks = models.ManyToManyField(TextBlock, through=OrderedTextBlock)

class OrderedTextBlock(models.Model):
    text_block = models.ForeignKey(TextBlock)
    product_page = models.ForeignKey(Page)
    weight = models.IntegerField()

    class Meta:
        ordering = ('weight',)

但我对我的应用程序违反DRY的情况并不十分热情。 (有很多订购的ManyToMany关系)。有没有推荐的方法来解决这个问题?

编辑:拼写错误

1 个答案:

答案 0 :(得分:0)

您也许可以创建自己的Custom Field - OrderedManyToManyField,也许是作为ManyToManyField的subclass

或者,如果这看起来并不理想,您可以使用现有的方法,创建多个“通过”模型,但subclass them彼此之间以尽可能坚持DRY

class OrderedM2M(models.Model):
    weight = models.IntegerField()

    class Meta:
        ordering = ('weight',)
        abstract = True

class OrderedTextBlock(OrderedM2M):
    text_block = models.ForeignKey(TextBlock)
    product_page = models.ForeignKey(Page)