Django MTMField: limit_choices_to = other_ForeignKeyField_on_same_model?

У меня есть пара моделей 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

У меня есть все виды удовольствия, пытаясь получить limit_choices_to работает над моделью галереи. Я только хочу, чтобы администратор показывал варианты фотографий, которые принадлежат тому же сайту, что и эта галерея. Это возможно?

3 ответа

Решение

Я бы удалил site поле на моем Photo модель и добавить ForeignKey в Gallery, Я бы удалил limit_choices_to от photos поля на Gallery модель.

Потому что вы используете ForeignKeyс 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

Как только вы установите site В галерее все его фотографии будут наследовать это свойство. И сайт будет доступен как photo_instance.gallery.site:

@property
def site(self):
    return self.gallery.site

Это должно работать так, как если бы вы имели site поле. Но я не проверял это.

Все изменится или, конечно, если вы решите, что галерея или фотография может появляться на нескольких сайтах.

Да. Вам необходимо переопределить форму, которую администратор использует для 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)

Согласно документам, "limit_choices_to не имеет никакого эффекта при использовании на ManyToManyField с промежуточной таблицей". Насколько я понимаю, это означает, что это никак не влияет, потому что ManyToManyFields использует промежуточные таблицы...

Я не пытался заставить его работать на сайте администратора, но из ваших собственных представлений вы можете создать форму и переопределить набор запросов, используемый для заполнения списка вариантов:

form.fields["photos"].queryset = request.user.photo_set.all()
Другие вопросы по тегам