Devoluções gerente modelar objetos uma vez por Request (Gerente Drops Objetos Depois de devolvê-los Once)

votos
0

O comportamento não estava relacionado com o problema, tal como apresentado imediatamente abaixo. Ver o fundo do post para uma explicação. obrigado.


Olá,

Atualmente, estou a ter o comportamento que o gerenciador padrão para um determinado modelo retorna os objetos para este modelo apenas uma vez por pedido ou por sessão shell. Abaixo está uma transcrição PDB de parar em uma visão (mas o comportamento ocorre sem APO, também):

#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()
[]

Sempre que eu recuperar um objeto, esse objeto não aparece mais na 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 comportamento é apenas para um dos meus modelos; os outros modelos parece consultar corretamente. Eu não acho que ele tem alguma coisa a ver com a definição do meu modelo, que é basicamente:

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

Peço desculpas por minha descrição é um pouco vago; Estou confuso sobre como esse comportamento pode surgir e não sabe onde a bisbilhotar seguinte.

O SQL gerado pelo Gestor para o QuerySet é o mesmo (e aparentemente correto) de 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()
[]

Eu estou usando Django 1.0.2, Python 2.6.1, eo SQLite que veio embalado com Python 2.6.1 no Mac OS 10.5 máquina.

Em resposta a um dos comentários que eu tentei renomear os related_nameparâmetros para entries1e entries2para evitar um possível conflito, mas isso não muda o comportamento.


RESOLVIDO (eu acho)

Desculpe, o problema era realmente sem relação com o problema como I apresentou. Eu tinha um bug descuidados em um dos meus sinais na entrada:

em myapp.__init__:

post_init.connect(entry_initialized, sender=Entry)

em 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)

A versão correta do meu código seria:

        #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()
Publicado 05/03/2009 em 06:50
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Desculpe, o problema era realmente sem relação com o problema como I apresentou. Eu tinha um bug descuidados em um dos meus sinais na entrada:

em myapp.__init__:

post_init.connect(entry_initialized, sender=Entry)

em 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)

A versão correta do meu código seria:

        #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()
Respondeu 14/02/2013 em 21:55
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more