如何限制django中的外键

时间:2012-03-08 14:51:09

标签: django orm foreign-keys admin

我正在使用django 1.2 我有两个模特。

编辑:我刚刚找到了一个更好的例子:

class Parent(models.Model):
    name = models.CharField(max_length=255)
    favorite_child = models.ForeignKey(Child)

class Child(models.Model):
    name = models.CharField(max_length=255)
    myparent = models.ForeignKey(Parent)

在这个例子中,我希望能够选择一个喜欢的孩子,但问题是管理员会给我所有的孩子可供选择,而不仅仅是我正在编辑的父母的子女。

原始示例:

class Version(models.Model):
    name = models.CharField(max_length = 255)
    platform = models.ForeignKey("Platform",related_name='version_platform')

class Platform(models.Model):
    name = models.CharField(max_length = 255)
    default_version = models.ForeignKey(Version,related_name='platform_default_version')

我希望django管理员在我选择default_version时限制下拉,以便我只能选择那些拥有当前平台的版本。
例如,如果我的版本名为'1.1',其平台joomla和版本'1.2',其中wordpress为平台 因此,当我在wordpress的管理员中选择default_version下拉列表时,我希望在下拉列表中仅显示我的版本“1.2”。现在它向我展示了所有版本。

我正在尝试将limit_choices_to限制为here 所以我试试这个:

class Platform(models.Model):
    name = models.CharField(max_length = 255)
    default_version = models.ForeignKey(Version,limit_choices_to={'platform':XXXXX},related_name='platform_default_version')

但我迷失了XXXX的内容,我尝试自我,但它不起作用 我也试过了

limit_choices_to={'platform.name':name}

我也没有工作。

在这个例子中,我希望能够选择一个喜欢的孩子,但问题是管理员会给我所有的孩子可供选择,而不仅仅是我正在编辑的父母的子女。

3 个答案:

答案 0 :(得分:2)

您可以尝试formfield_for_foreignkey

class PlatformAdmin(admin.ModelAdmin):
    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "default_version":
            kwargs["queryset"] = Version.objects.filter(platform=self.instance.pk)
        return super(PlatformAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

答案 1 :(得分:2)

我找到了基于Django: accessing the model instance from within ModelAdmin?

的解决方案

添加到admin.py 溶液:

class ParentForm(ModelForm):
def __init__(self, *args, **kwargs):
    super(ParentForm, self).__init__(*args, **kwargs)
    self.fields['favorite_child'].queryset = \
    Child.objects.filter(parent=self.instance.pk)

class ParentAdmin(admin.ModelAdmin):
    form = ParentForm

答案 2 :(得分:0)

这里的问题已经发生了变化。当你在谈论根据选择的平台进行适应的版本选项时,你谈论的是AJAX。您需要做的就是创建一个接受平台作为参数的视图,并返回JSON格式的版本列表。

然后,您将一个hander附加到平台选择框的onchange事件,该事件将通过AJAX获取该视图并使用JSON响应为版本选择框构建一组新选项。用新的和你的完成替换旧的选项。

本网站和网络上有很多例子。