1

我在 Django 中有一个模型:

class Task(models.Model):  
    product = models.ForeignKey(Product)  
    content = models.OneToOneField(ContentDataSet)  

如果我只想在标准下拉选择列表中的用户/管理员中 显示尚未分配的选项并且已经分配给此任务选项,我该如何使用limit_choices_to=字段 选项?contentContentDataSet

我尝试使用limit_choices_to = {'task__isnull':True},但在这种情况下,我看不到已分配给此任务content选项。

limit_choices_to = models.Q(task__isnull=True) | models.Q(task=self)不工作,因为self没有定义

4

2 回答 2

2

这不能用limit_choices_to 来完成。但是您可以使用两种不同的方法,它们都可以正常工作:

1)因为ForeignKeys您可以使用formfield_for_foreignkey这样覆盖 ModelAdmin 中的查询集:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
    if request.user.is_superuser:
        return super(UserOwnerProtectorModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    if db_field.name == "task":
        # This next line only shows owned objects
        # but you can write your own query!
        kwargs["queryset"] = db_field.related_model.objects.filter(user=request.user)
    return super().formfield_for_foreignkey(db_field, request, **kwargs)

2)作为第二选择,这里是一个覆盖字段查询集的示例,它可以帮助您处理 OneToOne 字段: Django ForeignKey limit_choices_to a different ForeignKey id

祝你好运!

于 2018-11-03T03:39:01.203 回答
0

Limit_choices_to 是一个 Q 对象。在文档中,您有一个对 ForeignKey 进行类似限制的示例:https ://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey.limit_choices_to

更多关于查询的信息在这里:https ://docs.djangoproject.com/en/dev/topics/db/queries/

于 2012-12-23T20:35:16.933 回答