Django MTMField:limit_choices_to = other_ForeignKeyField_on_same_model?

时间:2008-12-05 22:32:53

标签: python django foreign-keys manytomanyfield limit-choices-to

我有几个看起来像这样的django模型:

from django.contrib.sites.models import Site

class Photo(models.Model):
    title = models.CharField(max_length=100)
    site = models.ForeignKey(Site)
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self):
        return self.title


class Gallery(models.Model):    
    name = models.CharField(max_length=40)
    site = models.ForeignKey(Site)
    photos = models.ManyToManyField(Photo, limit_choices_to = {'site':name} )    

    def __unicode__(self):
        return self.name

我正在尝试各种 fun 试图让limit_choices_to处理Gallery模型。我只希望管理员显示与此图库属于同一网站的照片的选项。这可能吗?

3 个答案:

答案 0 :(得分:4)

是。您需要覆盖管理员用于Gallery模型的表单,然后限制该表单中photos字段的查询集:

class GalleryAdminForm(django.forms.ModelForm):

    class Meta:
        model = Gallery

    def __init__(self, *args, **kwargs):
        super(GalleryAdminForm, self).__init__(*args, **kwargs)
        self.fields['segments'].queryset = Photo.objects.filter(site=self.instance.site)


class GalleryAdmin(django.contrib.admin.ModelAdmin):
    form = GalleryAdminForm

django.contrib.admin.site.register(Gallery, GalleryAdmin)

答案 1 :(得分:1)

我会删除site模型上的Photo字段,并将ForeignKey添加到Gallery。我会从limit_choices_to型号上的photos字段中删除Gallery

因为您使用ForeignKeySite s,这意味着网站不会共享图库和照片。因此,我上面提到的那些已经没用了。

class Photo(models.Model):
    title = models.CharField(max_length=100)
    gallery = models.ForeignKey(Gallery, related_name='photos')
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self):
        return self.title


class Gallery(models.Model):    
    name = models.CharField(max_length=40)
    site = models.ForeignKey(Site)

    def __unicode__(self):
        return self.name

在图库中设置site后,其所有照片都会继承此属性。该网站将以photo_instance.gallery.site

的形式访问
@property
def site(self):
    return self.gallery.site

这应该就像你有一个site字段一样。但我还没有测试过它。

如果您认为图库或照片可以出现在多个网站中,那么事情就会发生变化或过程。

答案 2 :(得分:0)

根据docs,“limit_choices_to在具有中间表的ManyToManyField上使用时无效”。通过我的阅读,这意味着它完全没有效果,因为ManyToManyFields使用中间表......

我没有尝试在管理员网站中使用它,但是根据您自己的观点,您可以创建一个表单,override the queryset用于填充选项列表:

form.fields["photos"].queryset = request.user.photo_set.all()