2009-11-30 17 views
25

Esta es una pregunta de Django bastante simple, pero no encuentro la respuesta en los documentos de Django, ¡a pesar de la gran cantidad de búsquedas!Django: compruebe si ya existe un objeto antes de agregar

¿Cómo puedo comprobar si un objeto ya existe y solo agregarlo si no existe no ya existente?

Aquí está el código: no quiero agregar el follow_role dos veces en la base de datos si ya existe. ¿Cómo reviso primero? Use get() tal vez, pero ¿Django se quejará si get() no devuelve nada?

current_user = request.user 
follow_role = UserToUserRole(from_user=current_user, to_user=user, role='follow') 
follow_role.save() 

¡Gracias!

Respuesta

36

Hay una función de ayuda para este idioma llamado 'get_or_create' en el administrador de modelo:

role, created = UserToUserRole.objects.get_or_create(
    from_user=current_user, to_user=user, role='follow') 

devuelve una tupla de (modelo, bool), donde 'modelo' es el objeto que le interesa y 'bool' te dice si tuvo que ser creado o no.

+1

Brillante. Resuelve el problema. ¡Gracias! ¿Hay una función inversa para verificar si un objeto existe, luego SUPRIMIR si es así, y no hacer nada si no lo hace? – AP257

+2

No sé de una función auxiliar de la parte superior de mi cabeza, pero creo que puede acercarse haciendo UserToUserRole.objects.filter (...). Delete(). Sin embargo, esto no le daría una forma de inspeccionar si el objeto realmente existía. Debería verificar el conteo() en su conjunto de consultas antes de la eliminación. Por supuesto, puede echar un vistazo a la fuente get \ _or \ _create y crear su propia función de ayuda lo suficientemente fácil. –

+0

OK. Gracias de nuevo por la respuesta muy clara! – AP257

4

Si está utilizando una versión reciente de Django, puede usar la opción unique_together en el modelo UserToUserRole, y luego usar el método get_or_create() mostrado por Joe Holloway. Esto garantizará que no puedas obtener un duplicado.

0

Si desea que el cheque hecho cada vez antes de guardar se puede utilizar el pre Guardar señal para comprobar, http://docs.djangoproject.com/en/dev/ref/signals/#django.db.models.signals.pre_save

Alternativamente, en el modelo que podría especificar única = True para la propiedad que determina si un artículo es el mismo elemento, esto provocará que se genere una excepción (django.db.IntegrityError) si intenta guardar lo mismo otra vez.

Si usted tiene más de un campo juntos que hace algo único que tendrá que utilizar unique_together en la clase interna Meta http://docs.djangoproject.com/en/dev/ref/models/options/#unique-together

0

Puede utilizar get(), pero tendrá que envolverlo con intento -excepto como este:

try: 
    obj = UserToUserRole.objects.get(from_user=current_user, to_user=user, role='follow') 
except UserToUserRole.DoesNotExist: 
    # here write a code to create a new object 
Cuestiones relacionadas