我正在使用带有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关系)。有没有推荐的方法来解决这个问题?
编辑:拼写错误
答案 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)