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
с Site
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
поле. Но я не проверял это.
Все изменится или, конечно, если вы решите, что галерея или фотография может появляться на нескольких сайтах.
Да. Вам необходимо переопределить форму, которую администратор использует для 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()