如何在django中排序和包含规则排序?

时间:2014-07-28 08:03:18

标签: django django-admin django-admin-filters django-admin-tools

我不相信我正确地提出了这个问题,但这是我想要做的。

在django admin中,我想写一个动作来随机对我的参赛者名单进行排序,并且不允许两个名字相同的人在彼此的4个记录之内。基本上, 如果你有John L. John C. Carey J,Tracy M. Mary T.,记录会如下所示:

John L。

Mary T。

Carey J。

Tracy T。

John C.

              OR

如何编写一个可以创建随机组的操作,其中两个具有相同名称的人不在同一组中,如下所示:

John L. John C. Carey J,Tracy M. Mary T. =

第1组

John L。

Mary T。

Carey J。

Tracy T。

第2组

John C.

原谅我,如果不是很清楚,请告诉我,我会尝试进一步说明,但任何帮助将不胜感激

EDIT: 
Is this what you are referring to? I can't quite figure out how to compare the fields to see if they are the same

   Model:
class people(models.Model)
   fname = model.CharField()
   lname = model.CharField()
   group = model.IntegerField()


 View:
   N = 4
   Num = randint(0, N-1)
   for x in queryset:
       x.group = Num
       if group == group| fname == fname | lname == lname:
           x.group = (Num + 1) % N

1 个答案:

答案 0 :(得分:0)

你的第一个问题总是无法解决。想想所有参赛者都有相同的名字,那么你实际上找不到解决方案。

对于第二个问题,我可以建议一种算法来做到这一点。 由于我没有看到任何组的数量限制,我将建议一种方法来创建最少数量的组。

编辑:我认为你不希望2个人拥有相同的#34;名字"在一组。

步骤

  1. 计算每个名称的外观

    count = {}
    for x in queryset:
        if x.fname not in count:
             count[x.fname] = 0
        count[f.name] += 1
    
  2. 找到外观最多的名称

    N = 0
    for x in queryset:
        if count[x.fname] > N:
            N = count[x.fname]
    
  3. 创建N个组,其中N等于步骤2中名称的出现次数

  4. 对于每个名称,生成一个随机数X,其中X < N

    尝试将名称放入组X。如果组X已具有该名称,请设置X = (X + 1) % N并重试,重复直至成功。你总能找到一个小组来参赛选手。

    from random import randint
    groups = [[]] * N
    for item in queryset:
        X = randint(0, N-1)
        while item.fname in groups[X]:
            X = (X + 1) % N
        groups[X].append(item.fname)
        item.group = X
    
  5. 修改:

    在步骤1,2,4中添加了详细信息。

    从您编辑的代码段中,我认为您实际上并不需要定义&#34; group&#34;在模型中,似乎你只需要一个组号。