Se puede implementar una función para comprobar si la instancia Listing
tiene al menos una instancia de imagen y conectar esa función para el modelo Listing
pre_save signal
Va a ser algo así como: (suponiendo que está utilizando Django 1.3)
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Listing
...
@receiver(pre_save, sender=Listing)
def check_image_requirement(sender, instance, **kwargs):
if instance.images.count() == 0:
raise your_own_exception("Listing is required to have at least one image")
donde es necesario implementar your_own_exception
la siguiente adición es la respuesta a otra pregunta del PO
La implementación de Listing.clean()
es otra forma de lograr la misma regla de validación. De hecho, es el enfoque semánticamente correcto, ya que Model.clean()
está diseñado para validaciones de modelos personalizados. Pero adoptar este enfoque sería menos conveniente: para activar el clean()
, debe llamar manualmente al full_clean()
(si no usa el formulario del modelo) o llamar manualmente al is_valid()
(cuando usa el modelo), justo antes de llamar al save()
de un Listado ejemplo. Reference
Por otro lado, con el enfoque pre_save
señal, puede estar seguro de que la regla de validación se aplica siempre en Listing
ejemplo, cada vez que llame save()
en la instancia.
No es correcto o incorrecto elegir uno sobre el otro, sino simplemente una decisión de diseño para hacer. Ambos enfoques pueden lograr lo que necesita y mantener la lógica de negocio/dominio (es decir, su regla de validación) en la capa Modelos.
¿Qué quiere decir con asegurar? ¿Evitar guardar a menos que haya la cantidad requerida de imágenes? –
Sí, asegurándose de que al menos uno esté presente (y si es posible también tenga un máximo) – RS7
¿Lo necesita filtrar listados o en otro lugar? Mientras filtra, puede usar la anotación y filtrar por número resultante. – ilvar