يقوم المدير بإرجاع كائنات النموذج مرة واحدة لكل طلب (يسقط المدير الكائنات بعد إعادتها مرة واحدة)

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

  •  03-07-2019
  •  | 
  •  

سؤال

كان السلوك غير مرتبط بالمشكلة كما هو موضح مباشرة أدناه. انظر الجزء السفلي من المنشور للحصول على شرح. شكرًا.


مرحبًا،

أواجه حاليًا السلوك الذي يقوم المدير الافتراضي لنموذج معين بإرجاع الكائنات لهذا النموذج مرة واحدة فقط لكل طلب أو لكل جلسة قذيفة. يوجد أدناه نسخة PDB من التوقف في عرض (لكن السلوك يحدث بدون PDB أيضًا):

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

في أي وقت أستعيد فيه كائن ، لم يعد هذا الكائن يظهر في 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()
[]

هذا السلوك هو فقط لأحد طرازي ؛ يبدو أن النماذج الأخرى تستفسر بشكل صحيح. لا أعتقد أن الأمر له علاقة بتعريف النموذج الخاص بي ، وهو أساسي:

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

أعتذر أن وصفتي غامضة بعض الشيء ؛ أنا في حيرة من أمري حول كيفية ظهور هذا السلوك وليس متأكدًا من أين أتجول بعد ذلك.

SQL الذي تم إنشاؤه بواسطة المدير لـ QuerySet هو نفسه (ويبدو أنه صحيح) في كل مرة:

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

أنا أستخدم Django 1.0.2 و Python 2.6.1 و SQLite التي تم تعبئتها باستخدام Python 2.6.1 على جهاز Mac OS 10.5.

رداً على أحد التعليقات التي حاولت إعادة تسميتها related_name المعلمات ل entries1 و entries2 لتجنب الصراع المحتمل ولكن هذا لم يغير السلوك.


حل (أعتقد)

عذرًا ، لم تكن المشكلة في الواقع غير ذات صلة بالمشكلة كما قدمتها. كان لدي خطأ مهمل في إحدى إشاراتي عند الدخول:

في myapp.__init__:

post_init.connect(entry_initialized, sender=Entry)

في 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)

النسخة الصحيحة من الكود الخاص بي ستكون:

        #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()
هل كانت مفيدة؟

المحلول

عذرًا ، لم تكن المشكلة في الواقع غير ذات صلة بالمشكلة كما قدمتها. كان لدي خطأ مهمل في إحدى إشاراتي عند الدخول:

في myapp.__init__:

post_init.connect(entry_initialized, sender=Entry)

في 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)

النسخة الصحيحة من الكود الخاص بي ستكون:

        #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()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top