Django:我怎样才能在多对多关系中增加权重/排序?

cnwbcb6i  于 2023-02-06  发布在  Go
关注(0)|答案(2)|浏览(140)

我的页面上有文本块。文本块可能出现在不同的页面上,页面上可能有几个文本块。每个页面都可能有自己的顺序。这可以通过使用一个单独的 through 参数来解决。如下所示:

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关系)。有没有推荐的方法来解决这个问题?
编辑:排印错误

f4t66c6m

f4t66c6m1#

也许,您可以创建自己的自定义字段- OrderedManyToManyField,作为ManyToManyField的子类。
或者,如果这看起来不太理想,您可以使用您现有的方法,创建多个“通过”模型,但是将它们彼此子类化以尽可能地遵守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)
kpbwa7wx

kpbwa7wx2#

pycruft的答案是完美的。你的sortedm 2 m也很棒。我能建议一个mod吗?加权排序也会考虑一个M2M,这样每个给定的用户模型,或者Subreddit,都有一个不同的权重系统(现在称为社区,在我的站点上我称它们为空间-因为它为围绕某个主题的讨论打开了一个空间,因为社区元素是从IRL版本的社区中分离出来的,IRL版本的社区需要一个字面上的建立地点,如教堂或俱乐部或团体宅基地等,但现在他们用它来指“LGBT”社区等)。
理想情况下,我会做M2 M2M,这样每个帖子都可以为每个用户的每个空间获得一个权重。允许我们定义一个可定制的、更新的指标,以便根据相关部分显示的相对兴趣,我们可以逐部分创建建议帖子的机制。
显然,我们也会有很多这样的词,所以也会有形容词/修饰语添加到“建议”一词中,达到“建议新奇”的程度(影响他们创造力的东西)、“独特建议”(对他们来说很突出的东西),“闻所未闻的建议”(一些他们没听说过的东西),“建议打开思路”(关于他们不同意但可能改变主意的主题)、“建议的思维拓展”(为他们已经创造的想法增加新奇感的信息)、
以及用于其他默认排序的其他修饰符,例如,除了“New”/“Recent”之外,我们还可以使用“Unheard of New”(既新又不常见到的事物)等。
以及其他类似“超级传播者”的东西(新鲜的、被高度喜欢但评论很低的东西)、《长时间的幻想》(事情基于他们最常说的,几乎从来没有被别人谈论过,但很久以前就被提到过,在某个地方某个时候),而另一种选择将是“长寿的幻想”(事情基于他们在某个时候说过的话,但当由合适的人说时超级受欢迎)。
然后是用户排序的事情,而不仅仅是帖子排序,因为M2 M2 M2M将需要应用到每个M2M。所以“可能喜欢”(你可能会喜欢的帖子),“可能会狩猎”(你会愤怒的人),“可能会追逐”(你可能喜欢也可能不喜欢的人,但从现在开始你要检查他们所有的东西),“可能会追溯”(人谁的历史职位(可以进一步修改,以包括历史投票,历史评论)你可能想通过)...
这个清单还在继续。我们必须为一些超级计算机和超级人工智能做好准备。然后,它可以是用户可修改的,这样,当他们使用人工智能进行任何加权排序时,他们可以通过选择从给定排序中删除某些特定的东西来教我们如何做(然后换一种方式,因为这样就有了恨恨和爱的空间--人们的心情会改变,他们对不同心情的渴望也会改变)。
哦。我刚刚仔细看了一下你的django-sortedm 2 m。这解决了很多问题。你能根据这个问题和答案添加另一个选项来包含给定的“权重”吗?或者我应该分叉并选择那个。

gallery = Gallery.objects.create(name='Photos ordered by name')
for photo in Photo.objects.order_by('name'):
    weight = AI_Self_Suggester_Output(photo)
    gallery.photos.add(photo, weight)

相关问题