El administrador devuelve los objetos del modelo una vez por solicitud (el administrador descarta los objetos después de devolverlos una vez)

StackOverflow https://stackoverflow.com/questions/613706

  •  03-07-2019
  •  | 
  •  

Pregunta

El comportamiento no estaba relacionado con el problema como se presenta a continuación. Vea la parte inferior de la publicación para una explicación. gracias.


Hola,

Actualmente estoy experimentando el comportamiento de que el Administrador predeterminado para un Modelo en particular devuelve los objetos para este Modelo solo una vez por solicitud o por sesión de shell. A continuación se muestra una transcripción de PDB de detenerse en una vista (pero el comportamiento se produce sin PDB también):

#Nothing up my sleeves (using the default Manager):
(Pdb) p Entry.objects
<django.db.models.manager.Manager object at 0x18523b0>

#Now you see them...
(Pdb) Entry.objects.all()
[<Entry: Entry 1>, <Entry: Entry 2>, <Entry: Entry 3>, <Entry: Entry 4]

#Now you don't!
(Pdb) Entry.objects.all()
[]

Cada vez que recupero un objeto, ese objeto ya no aparece en QuerySets posteriores.

#(New Request from above)

#If I only request one object then it is the one that disappears
(Pdb) Entry.objects.all()[0]
[<Entry: Entry 1>]

#Here Entry 1 is missing
(Pdb) Entry.objects.all()
[<Entry: Entry 2>, <Entry: Entry 3>, <Entry: Entry 4]

#And now they're all gone.
(Pdb) Entry.objects.all()
[]

Este comportamiento es solo para uno de mis modelos; Los otros modelos parecen consultar correctamente. No creo que tenga nada que ver con la definición de mi modelo, que es básicamente:

class Entry(models.Model):
    user = models.ForeignKey(User, related_name='entries')
    blog = models.ForeignKey(Blog, related_name='entries')
    positive = models.BooleanField()

Me disculpo porque mi descripción es un poco vaga; Estoy confundido acerca de cómo podría surgir este comportamiento y no estoy seguro de dónde meterme en el siguiente.

El SQL generado por el Administrador para el QuerySet es el mismo (y aparentemente correcto) cada vez:

(Pdb) p Entry.objects.all().query.as_sql()
('SELECT "myapp_entry"."id", "myapp_entry"."user_id", "myapp_entry"."blog_id", "myapp_entry"."positive" FROM "myapp_entry"', ())
(Pdb) p Entry.objects.all()
[<Entry: Entry 1>, <Entry: Entry 2>, <Entry: Entry 3>, <Entry: Entry 4]

(Pdb) p Entry.objects.all().query.as_sql()
('SELECT "myapp_entry"."id", "myapp_entry"."user_id", "myapp_entry"."blog_id", "myapp_entry"."positive" FROM "myapp_entry"', ())
(Pdb) Entry.objects.all()
[]

Estoy usando Django 1.0.2, Python 2.6.1 y el SQLite que venía empaquetado con Python 2.6.1 en una máquina Mac OS 10.5.

En respuesta a uno de los comentarios, intenté cambiar el nombre de los parámetros related_name a entries1 y entries2 para evitar un posible conflicto, pero esto no sucedió. cambiar el comportamiento.


SOLUCIONADO (creo)

Lo siento todo, el problema no estaba relacionado con el problema tal como lo presenté. Tuve un error por descuido en una de mis señales en la entrada:

En myapp .__ init__ :

post_init.connect(entry_initialized, sender=Entry)

En myapp.signals :

def entry_initialized(sender, instance, *args, **kwargs):
    try:
        #Disconnect signal to avoid infinite recursion
        post_init.disconnect(entry_initialized, sender=Entry)

        #Intializing a new Entry here would cause the recursion
        #Check to see if there is a previous entry by this user in this blog
        #In this app entries are unique by (User, Blog)
        #And what we want to do is remove the old Entry if the positive fields don't match
        prev_instance = Entry.objects.get(user=instance.user, blog=instance.blog)

        #This is an error: it is not appropriate to delete without some checking
        prev_instance.delete()

        post_init.connect(verification_initialized, sender=Verification)
    except:
        post_init.connect(verification_initialized, sender=Verification)

La versión correcta de mi código sería:

        #Only delete if this is a different Entry with same user/blog and the positive field is different.
        if not instance.id == prev_instance and not instance.positive == prev_instance.positive:
            prev_instance.delete()
¿Fue útil?

Solución

Lo siento todo, el problema no estaba relacionado con el problema tal como lo presenté. Tuve un error por descuido en una de mis señales en la entrada:

En myapp .__ init__ :

post_init.connect(entry_initialized, sender=Entry)

En myapp.signals :

def entry_initialized(sender, instance, *args, **kwargs):
    try:
        #Disconnect signal to avoid infinite recursion
        post_init.disconnect(entry_initialized, sender=Entry)

        #Intializing a new Entry here would cause the recursion
        #Check to see if there is a previous entry by this user in this blog
        #In this app entries are unique by (User, Blog)
        #And what we want to do is remove the old Entry if the positive fields don't match
        prev_instance = Entry.objects.get(user=instance.user, blog=instance.blog)

        #This is an error: it is not appropriate to delete without some checking
        prev_instance.delete()

        post_init.connect(verification_initialized, sender=Verification)
    except:
        post_init.connect(verification_initialized, sender=Verification)

La versión correcta de mi código sería:

        #Only delete if this is a different Entry with same user/blog and the positive field is different.
        if not instance.id == prev_instance and not instance.positive == prev_instance.positive:
            prev_instance.delete()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top