Manager Gibt Modell-Objekte Einmal Pro Anfrage (Manager Tropfen Objekte Nach Ihrer Rückkehr Einmal)

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

  •  03-07-2019
  •  | 
  •  

Frage

Das Verhalten war unabhängig von dem problem, da legte sofort unten.Siehe unten im Beitrag für eine Erklärung.vielen Dank.


Hallo,

Ich bin gerade erleben, das Verhalten, das der Standard-Manager für ein bestimmtes Modell gibt die Objekte für dieses Modell nur einmal pro Antrag oder pro-shell-Sitzung.Unten ist eine PDB-transcript von anhalten in einer Ansicht (aber das Verhalten tritt auf, ohne PDB, auch):

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

Immer, wenn ich rufen Sie ein Objekt, das Objekt erscheint nicht mehr in späteren QuerySets.

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

Dieses Verhalten ist nur für eines meiner Modelle;die anderen Modelle scheint Abfrage korrekt.Ich glaube nicht, dass es nichts zu tun hat mit meinem Modell die definition, die im Grunde genommen:

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

Ich entschuldige mich, dass Sie meine Beschreibung ist etwas vage;Ich bin verwirrt darüber, wie dieses Verhalten sich ergeben könnten und nicht sicher, wo Sie kramen weiter.

Die generierte SQL von der Manager für die QuerySet ist die gleiche (und anscheinend zu beheben) jedes mal:

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

Ich bin mit Django 1.0.2, Python 2.6.1, und die SQLite-kam verpackt mit Python 2.6.1 auf einem Mac OS 10.5-Maschine.

In der Antwort auf einen der Kommentare, die ich versuchte Umbenennung der related_name Parameter entries1 und entries2 um zu vermeiden, einen möglichen Konflikt aber das hat das Verhalten nicht geändert.


GELÖST (glaube ich)

Sorry alle, das problem war eigentlich nichts mit dem problem als ich ihn vorgestellt.Ich hatte eine unvorsichtige Fehler in einem meiner Signale auf den Eintrag:

In myapp.__init__:

post_init.connect(entry_initialized, sender=Entry)

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

Die richtige version von meinem code wäre:

        #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()
War es hilfreich?

Lösung

Sorry alle, das problem war eigentlich nichts mit dem problem als ich ihn vorgestellt.Ich hatte eine unvorsichtige Fehler in einem meiner Signale auf den Eintrag:

In myapp.__init__:

post_init.connect(entry_initialized, sender=Entry)

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

Die richtige version von meinem code wäre:

        #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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top