在Django中有效地重新排序排名的收藏集

时间:2019-06-14 11:46:12

标签: django sorting linked-list unique-constraint m2m

比方说,我想拥有一些书籍,并且在每个集合中按独特的排名对书籍进行排序。

一个简单的实现可能看起来像这样:

class Book(models.Model):
    title = models.CharField(max_length=100)
​
​
class Collection(models.Model):
    # e.g. adventure, classic, fairy tale, ....
    genre = models.CharField(max_length=100)
​
​
class Membership(models.Model):
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    rank = models.PositiveSmallIntegerField()
​
    class Meta:
        ordering = ('rank',)
        # 1. Can't have same rank twice in a given collection
        # 2. Don't want duplicate books in same collection
        unique_together = (('collection', 'rank'), ('collection', 'book'))

这可以正常工作,但是主要问题是我是否要在尊重唯一性约束的同时以新的,不同的方式重新排序集合 例如。假设某些收藏有

  1. 战争与和平
  2. 犯罪与惩罚
  3. 赌徒
  4. 钟声给谁
  5. 白鲸迪克

我们想重新排序

  1. 白鲸迪克
  2. 钟声给谁
  3. 白鲸迪克
  4. 犯罪与惩罚
  5. 赌徒

我们该怎么做?仅仅尝试重新分配像Moby Dick = 1这样的等级会失败,因为已经有一个等级1的成员资格(“战争与和平”),并且唯一的约束条件将禁止这样做。 ID 必须以某种方式同时更改所有职位?

每次我要重新排序时,我都只是简单地删除了集合的所有Memberships,并用新的排名重新创建了它们,但这并不是很有效。 四处阅读,我想知道链表方法是否可以帮助我摆脱困境?如果是这样的话,如何与上面的示例完全一样?

还有其他想法吗?

1 个答案:

答案 0 :(得分:-1)

如果您只想获取随机订单查询集,则可以执行.order_by('?')

相关问题