django - Django模型中外键的动态选择
问题描述
我目前在为模型中的字段实现动态选择时遇到了一些困难。有问题的模型如下。
class Item(models.Model):
# Fields
...
item_type = models.ForeignKey(Type, on_delete=models.PROTECT)
型号型号
class Type(models.Model):
# Fields
group = models.CharField(max_length=50, editable=False)
name = models.CharField(max_length=30, help_text="Enter category name")
...
# Methods
def __str__(self):
return str(self.name)
我想要的是限制Type
该字段返回的数量。我的每个Type
条目都有一个“组”字段,我只想返回与Type
当前用户所在的组具有相同组的条目。例如,组“g1”中的用户在创建时Item
只能选择Type
在组字段中带有“g1”。
我已经签出limit_choices_to
,但我不确定如何让用户组打开表单,以便我可以将其传递到limit_choices_to
. 如果有人可以提供建议或任何不同的方法来解决这个问题,我们将不胜感激。
解决方案
您可以覆盖默认对象管理器或添加自定义对象管理器。在你的情况下会是这样的。
class TypesManager(models.Manager):
def get_queryset(self, user_group):
qs = super(TypesManager,self).get_queryset().filter(group_id=user_group.id)
class Type(models.Model):
group = models.ForeignKey(Group, verbose_name='Group')
name = models.CharField(max_length=30, help_text="Enter category name")
# default_manager
objects = TypesManager()
# custom_manager
custom_manager = TypesManager()
# Methods
def __str__(self):
return str(self.name)'
您可以在此处阅读有关管理器的更多信息https://docs.djangoproject.com/en/2.0/topics/db/managers/
或者,如果您只想限制特定表单的类型,您可以在表单init中过滤初始数据
推荐阅读
- c++ - 为什么调用析构函数后堆分配的对象仍然可以被引用?
- c++ - 多态性如何与 C++ 中的成员变量一起工作?
- elasticsearch - ElasticSearch 将 Rest 查询转换为传输客户端 Java 代码
- python - 使用 2 个 SQS 订阅向 SNS 主题发送消息,每个订阅都有一个 lambda 触发器导致空队列
- java - 查找两个矩阵之间的偏移量
- python - 将一行附加到熊猫数据框
- powershell - 对每列进行排序并仅显示 CSV 中的最大值 - powershell
- c# - 有没有办法单元测试可以访问输出来断言?
- c# - 如何通过服务器端更新 Materializecss 自动完成?
- typescript - 从 firebase 6.0 更新到 6.1 正在破坏我的云功能应用程序初始化