Django Admin如何在OneToOneField中的limit_choices_to选项中填充值?

Django Admin如何在OneToOneField中的limit_choices_to选项中填充值?,django,python-2.7,django-admin,Django,Python 2.7,Django Admin,我需要限制Django管理表单中的选项,但无法找到解决方案。鉴于这些模型: class ProductFamily(models.Model): name = models.CharField(max_length=250) default_product_to_display = models.OneToOneField('Product', limit_choices_to={'product_family': ??????}) # Enclosing Produc

我需要限制Django管理表单中的选项,但无法找到解决方案。鉴于这些模型:

class ProductFamily(models.Model):
    name = models.CharField(max_length=250)
    default_product_to_display = models.OneToOneField('Product', limit_choices_to={'product_family': ??????}) 
    # Enclosing Product reference in quotes is necessary since the Product declaration is below ProductFamily declaration

class Product(models.Model):
    name = models.CharField(max_length=250)
    image = models.ImageField(upload_to='images/',blank=True,null=True)
    product_family = models.ForeignKey(ProductFamily)
在班级产品系列中应该放置什么?我已经尝试了我能想到的一切,包括name、'name'ProductFamily、'ProductFamily、'self、self.id。带有self的选项返回内部服务器错误。带引号的选项返回:“int()的文本无效”。如果未加引号地使用“name”,则返回: int()参数必须是字符串或数字,而不是“CharField”。
如果我放入一个硬编码的整数值来测试它,那么它工作正常,因此它显然是在寻找整数值。 我也尝试过,但都没有成功 id=models.AutoField(主键=True) 在带有id的声明中,以及定义一个返回self.id的函数,但这些都不起作用


那么-如何通过仅显示其产品系列id与当前产品系列id匹配的产品来限制产品的选择呢?

最好的方法是使用自定义表单限制字段的查询集,因为尝试动态地将
限制选项设置为
非常困难,如果不是完全不切实际的话

例如:

class ProductFamilyForm(forms.ModelForm):

    def __init__(self *args, **kwargs):
        if 'initial' in kwargs:
            self.fields['default_product_to_display'].queryset = Product.objects.filter(
                product_family=initial.product_family)

非常感谢。这几乎成功了,但“初始产品系列”没有起作用。以下是最终起作用的:
类ProductFamilyForm(forms.ModelForm):def(ProductFamilyForm,self,*args,**kwargs):super(ProductFamilyForm,self)。(类ProductFamily,**kwargs)self.fields['default_product_u_uto_udisplay']。queryset=product.objects.filter(产品族=self.instance.pk)类ProductFamilyAdmin(admin.ModelAdmin):form=ProductFamilyForm list_display=('id','name','category','default_product_to_display',)list_filter=('category',)
当然不是:)这是一个伪代码示例,您可以提供自己的值。