Django MTMField:limit_choices_to = other_ForeignKeyField_on_same_model?

sat*_*ace 5 python django foreign-keys limit-choices-to manytomanyfield

我有几个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
Run Code Online (Sandbox Code Playgroud)

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

Veb*_*osa 6

是的。您需要覆盖管理员用于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)
Run Code Online (Sandbox Code Playgroud)


muh*_*huk 2

我会删除模型site上的字段Photo并添加ForeignKeyGallery. 我会limit_choices_to从模型photos上的字段中删除Gallery

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

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
Run Code Online (Sandbox Code Playgroud)

site一旦您在图库上设置了 ,它的所有照片都将继承此属性。该网站将通过以下方式访问photo_instance.gallery.site

@property
def site(self):
    return self.gallery.site
Run Code Online (Sandbox Code Playgroud)

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

如果您决定画廊或照片可以出现在多个站点中,事情就会发生变化或发展。

  • 迟到的评论...这用更好的设计解决了提问者的问题,但没有回答问题!我有同样的问题,但设计更改无法完成,这就像一个 CustomUser 有一组可能的选项(M2M 到选项),只有高级经理才能更改,但其中有一组活动选项(第二个 M2M到选项,从第一个列表中的选项中进行选择)。同一组选项的子集也必须分配给其他对象,因此不可能反转关系。 (8认同)