【问题标题】:How can I sort and include rules sorting in django?如何在 django 中排序和包含规则排序?
【发布时间】:2014-09-19 09:08:53
【问题描述】:

我不确定我是否正确地提出了这个问题,但这是我想做的。

在 django admin 中,我想编写一个操作,对我的参赛者列表进行随机排序,并且不允许两个名字相同的人在彼此的 4 条记录内。所以基本上, 如果您有 John L. John C. Carey J、Tracy M. Mary T.,则记录将按如下方式列出:

约翰·L.

玛丽·T.

凯莉·J。

特蕾西·T.

约翰·C.

              OR

我如何编写一个动作来创建随机组,其中两个同名的人不会在同一个组中,如下所示:

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

第一组

约翰·L.

玛丽·T.

凯莉·J。

特蕾西·T.

第 2 组

约翰·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

【问题讨论】:

  • 我想我没有理解正确,你想要一个按顺序排列的分组吗?你能解释一下你想用 SQL 怎么做吗?

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


【解决方案1】:

您的第一个问题无法始终得到解决。想一想所有参赛者的名字都一样,其实你也找不到解决办法。

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

编辑:我假设您不希望组中有 2 个具有相同“名字”的人。

步骤是

  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
    

编辑:

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

从您编辑的代码段中,我认为您实际上不需要在模型中定义“组”,因为您似乎只需要一个组号。

【讨论】:

  • 这就是你的想法吗? 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 我不知道如何比较字段以查看它们是否相同
  • 由于您没有提供实际模型,我只给出了如何做到这一点的概念。我不知道您的数据是如何存储的,所以我无法判断如何比较“名称”。既然你已经提供了模型,那就好多了。
  • 我喜欢它的发展方向,只要我可以比较这些字段以防止它们两次出现在同一组中。有什么想法吗?
  • 请指定您希望如何按名字比较姓名?全名?我猜你的例子是比较名字,但代码是比较全名,这很令人困惑。 N 不是硬编码的。您必须按照步骤 1 和步骤 2 找出 N。您可以使用 dict 来执行步骤 1 和步骤 2。我将编辑我的答案以显示这一点。
  • 我想按全名比较。是的,我知道 N 不是硬编码的,这只是我测试代码的一种快速方法,因为虽然我得到了你告诉我要做的事情,但我仍然必须弄清楚如何去做(我仍然很新:])。最后我才意识到我可能会限制一个小组中的人数,以使小组尽可能平等(我希望如果没有足够的人,最后一组的人会更少比其他人) - 非常感谢你,我至少像以前一样知道去哪里,我没有。
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2016-10-03
  • 2011-06-04
  • 2010-11-27
  • 2018-12-19
相关资源
最近更新 更多