Django MTMField: limit_choices_to = other_ForeignKeyField_on_same_model?

Tengo un par de modelos de django que se ven así:

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 

Me estoy divirtiendo todo el tiempo tratando de obtener el limit_choices_to trabajar en el modelo de Gallery. Solo quiero que el administrador muestre opciones para las fotos que pertenecen al mismo sitio que esta galería. es posible?

Eliminaré el campo del site en mi modelo de Photo y agregaría un ForeignKey a la Gallery . limit_choices_to de los campos de photos en el modelo de Gallery .

Debido a que está usando ForeignKey s para los Site , eso significa que los sitios no comparten galerías y fotos. Por lo tanto, tener los que he mencionado anteriormente ya es inútil.

 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 

Una vez que establezca el site en una galería, todas sus fotos heredarán esta propiedad. Y el sitio será accesible como photo_instance.gallery.site :

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

Esto debería funcionar como si tuviera un campo de site . Pero no lo he probado.

Las cosas cambian o cambian, si decides que una galería o una foto puede aparecer en varios sitios.

Sí. Debe anular el formulario que el administrador utiliza para el modelo de la Gallery y, a continuación, limite la consulta del campo de photos en ese formulario:

 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) 

De acuerdo con los documentos , “limit_choices_to no tiene efecto cuando se usa en un ManyToManyField con una tabla intermedia”. Por mi lectura, eso significa que no tiene ningún efecto en absoluto, porque ManyToManyFields usa tablas intermedias …

No he intentado hacer que funcione en el sitio de administración, pero desde sus propios puntos de vista, puede crear un formulario y anular el conjunto de consultas utilizado para completar la lista de opciones:

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