【问题标题】:Best way to save availability of user over days of week in python/django在 python/django 中保存用户可用性的最佳方法
【发布时间】:2011-03-02 13:36:51
【问题描述】:

我想存储用户在一周中可能有空的日期的偏好。例如用户可以在周六、周日可用,但在其他日子不可用。 目前,我正在使用 7 个复选框(值 = 1,2,...7)的数组,以便用户可以选择其可用性的各个日期。

现在第一个问题是如何将其存储在数据库中。我正在考虑使用字符串(长度 = 7)并存储像 1100010 这样的首选项,其中 1 表示可用,0 表示不可用。这是好的做法吗?

第二个问题,如何将POST数据(["1","2","7"])转换成字符串(1100010)

【问题讨论】:

    标签: python django


    【解决方案1】:

    第一个 - 很好的解决方案,我也在做类似的事情。 第二 - 您应该考虑分配每天的 2 次幂,这样使用 bin() 将这些数字转换为二进制很容易,并且您只需执行 & 即可轻松进行比较。

    >>> mon, tue, wed, thu, fri, sat, sun = (pow(2, i) for i in range(7)) 
    >>> bin(mon)
    '0b1'
    >>> bin(sun)
    '0b1000000'
    
    # create range:
    >>> x = mon | wed | fri
    >>> bin(x)
    '0b10101'
    
    # check if day is in range:
    >>> x & mon
    1
    >>> x & tue
    0
    

    bin的问题是你必须在开头添加0才能得到7个字符的长字符串, 但您也可以像这样编写自己的版本:

    bin = lambda n:"".join([str((n >> y) & 1) for y in range(7-1, -1, -1)]) 
    

    【讨论】:

      【解决方案2】:

      我找到了 David Cramer 的 BitField 的实现,它应该可以满足您的需求。看起来很不错。

      【讨论】:

      • 某些函数在 SQLite 上不起作用。这可能是也可能不是问题。
      【解决方案3】:

      这有点棘手,但鉴于工作日不会改变,如果您将带有每天名称的列添加到可用性表中,0 或 1 表示可用性,您的进一步代码可能会更清晰。这可能看起来有点多余,但将来会更容易编码和维护。

      第二个问题,如何将POST数据(["1","2","7"])转换成字符串(1100010)

      week=['0']*7
      for day in ["1","2","7"]:
          week[int(day) - 1]='1'
      week=''.join(week)
      

      【讨论】:

      • 我同意单独的列会更清晰,但在这种情况下,我会将它们设为布尔值:P
      • 这就是我的意思。 SQL boolean 只是一个带有 0 或 1 的小整数,但我认为这实际上取决于数据库服务器。
      • 小错误更正:week[int(day)]='1' 实际上应该是 week[int(day)-1]='1'
      • 已修复。可以通过记住以下规则来避免:“生命始于 40,计数始于 0。”
      【解决方案4】:

      另一种选择是将其存储为逗号分隔的整数。 Django 有一个内置字段:http://docs.djangoproject.com/en/1.2/ref/models/fields/#commaseparatedintegerfield

      【讨论】:

        【解决方案5】:

        另一个选项或多或少是显而易见的:定义一个星期几的表格,并有一个ManyToManyField 映射到另一个。管理员可以正常工作,您可以根据日期进行搜索,并且它可以在 SQLite 上运行,这与 django-bitfield 中的某些功能不同。搜索可以很快,因为它们在数据库中,并且您不必使用 SQL 的 LIKE(如果字符串开头有通配符,它​​将忽略索引,CommaSeparatedIntegerField 或七个字符的字符串)。

        当然,它需要更多存储空间,但是您有多少用户呢?百万?

        附:如果您的工作日表中有一个排序字段,您还可以使用 queryset.order_by('available__order') 之类的内容为您按星期几对数据库进行排序。

        【讨论】:

          【解决方案6】:

          我会选择单独的布尔列

          然后查询(例如,周一有空的用户)会容易得多;或计算每个工作日可用的用户数量,或其他。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-01
            • 2010-11-07
            • 2010-10-19
            • 2016-08-07
            • 1970-01-01
            • 2023-03-06
            • 2021-04-12
            • 1970-01-01
            相关资源
            最近更新 更多