Django模型中外键的​​动态选择

时间:2018-08-06 13:27:13

标签: django django-models django-rest-framework

我目前在为模型中的字段实现动态选择时遇到一些困难。有问题的模型如下。

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条目。例如,创建Item时,组“ g1”只能在组字段中选择带有“ g1”的Type

我已经签出limit_choices_to,但是我不确定如何让用户组打开表单,以便将其传递到limit_choices_to中。如果有人可以提供建议或任何其他方法来解决此问题,将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

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

表单过滤初始数据