首页 > 解决方案 > 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. 如果有人可以提供建议或任何不同的方法来解决这个问题,我们将不胜感激。

标签: djangodjango-modelsdjango-rest-framework

解决方案


您可以覆盖默认对象管理器或添加自定义对象管理器。在你的情况下会是这样的。

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中过滤初始数据


推荐阅读