【问题标题】:Django: Limit QuerySet to user input (checkboxes)Django:将 QuerySet 限制为用户输入(复选框)
【发布时间】:2013-05-06 18:45:52
【问题描述】:

我的问题类似于Django Advanced Filtering,但我需要另一种方法:

摘要:

  • 桌子:制造商、耗材
  • 制造商有多个供应(“供应”表中的 1 或 0)

我有一个带有多个(20 多个复选框)的 HTML 表单,它应该限制带有 AND 查询的查询集(非常标准)。 HTML 复选框名称等于 MySQL 字段名称。我的桌子是这样的:

mysql> explain supply;
+----------------------+------------+------+-----+---------+----------------+
| Field                | Type       | Null | Key | Default | Extra          |
+----------------------+------------+------+-----+---------+----------------+
| id                   | int(11)    | NO   | PRI | NULL    | auto_increment |
| manufacturer_id      | int(11)    | NO   | MUL | NULL    |                |
| supply1              | tinyint(1) | NO   |     | NULL    |                |
| supply2              | tinyint(1) | NO   |     | NULL    |                |
| supply3              | tinyint(1) | NO   |     | NULL    |                |
| [...]                | tinyint(1) | NO   |     | NULL    |                |
| supply20             | tinyint(1) | NO   |     | NULL    |                |

现在在伪 SQL 中,我想:

  • 用户选择的复选框 supply2 和 supply14:SELECT * FROM supply WHERE supply2 = 1 AND supply14 = 1;
  • 用户选择的复选框 supply1、supply9 和 supply18:SELECT * FROM supply WHERE supply1 = 1 AND supply9 = 1 AND supply18 = 1;

我很确定我需要一些带有 kwargs 的 QuerySet,但我无法根据需要构建视图(仍在学习 Django)。

【问题讨论】:

  • 我想知道这里的数据模型是否不能使用一些调整?您可能希望有一个包含 20 行的供应表和一个连接它们的中间表(即 ManytoMany(Supply) 或类似的东西)。然后你可以只拥有一个多选字段,而不是 20 个复选框(除非你真的因为其他原因需要它们)。
  • 同意@JamesR。如果您需要其他供应,您会怎么做?这就是多对多关系的用途。
  • 你是对的。我需要调整我的数据库布局。 @JamesR:如果您可以发表评论作为答案,我会接受。

标签: django checkbox django-queryset keyword-argument


【解决方案1】:

我想知道这里的数据模型是否不能使用一些调整?您可能希望有一个包含 20 行的供应表和一个连接它们的中间表(即 ManytoMany(Supply) 或类似的东西)。然后你可以只拥有一个多选字段,而不是 20 个复选框(除非你真的因为其他原因需要它们)。

如果您需要添加其他供应,只需添加另一行,而不是架构迁移。

【讨论】:

    【解决方案2】:
    supplies = Supply.objects.filter( supply1 = 1 )
    

    如果你想再次过滤:

    supplies = supplies.filter(supply2 = 1) 
    

    filter() 方法返回一个 QuerySet,因此您可以链接任意数量的 filter() 调用。

    【讨论】:

    • 谢谢,虽然这是一个选项,但由于我的数据库设计错误,它不像需要的那样灵活。无论如何,+1
    • 是的,现在看看 James R 的评论我意识到他是对的,你应该优先切换到多对多关系。
    猜你喜欢
    • 2018-07-12
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 2013-08-11
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多