Fielderror عند التعليق على المفاتيح الأجنبية
-
23-09-2019 - |
سؤال
لدي ملف نماذج يشبه ما يلي:
class WithDate(models.Model):
addedDate = models.DateTimeField(auto_now_add=True)
modifiedDate = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Match(WithDate):
...
class MatchFilter(django_filters.FilterSet):
class Meta:
model = Match
class Notify(WithDate):
matchId = models.ForeignKey(Match)
headline = models.CharField(null=True, blank=True, max_length=10)
لكل مباراة أحاول الحصول على عدد من السجلات التي لها عنوان. لذا يبدو أن مكالمتي
matchObjs = Match.objects.annotate(notifies_made=Count('notify__headline__isnull'))
هذا يحافظ على رمي فيلدرور. لقد قمت بتبسيط الاستعلام لأسفل
matchObjs = Match.objects.annotate(notifies_made=Count('notify'))
وما زلت أحصل على نفس Fielderror ... لقد رأيت هذا العمل في حالات أخرى (وثائق أخرى ، وآخر مثل أسئلة مثل هذا) لكن لا يمكنني معرفة سبب حصولني على خطأ.
الخطأ المحدد الذي يتم إرجاعه هو كما يلي:
لا يمكن حل الكلمات الرئيسية "الإخطار" في الحقل. الخيارات هي: (جميع الحقول من نموذج المطابقة)
هل لدى أي شخص أدنى فكرة عن سبب عدم تمكني من الحصول على هذا التعليق التوضيحي عبر الجداول؟ لقد حيرت بعد النظر إلى الآخر ، لذا فإن مستندات Django المختلفة حيث رأيت ذلك.
تحرير: أنا أستخدم Django 1.1.1
تحرير 2: لقد حاولت إعادة تسمية حقل MatchId لمطابقة فقط ... وقمت بإلغاء فئة WindDate ، مضيفًا في المعدل المضافة و ModifiedDate مباشرة في تعريفات فئة النموذج. لم تتخلص أي من هذه التغييرات من رسالة الخطأ.
تحرير 3: بعد إعادة بناء مقال ملف النماذج الخاص بي ، أدركت أن إدراج مكون من قِبل Django-Filter من Alex Gaynor كان يسبب المشكلة. لم أكن أعتقد أن هذا كان ذا صلة في البداية ، ولكن بما أنه الآن ، فقد قمت بتضمين فئة Filterset Match التي تسبب الخطأ. عندما أقوم بإزالة فئة MatchFilter ، فإنه يعمل بشكل جيد. أحاول أن أذهب عبر رمز مرشح Django لمعرفة سبب حدوث ذلك ، ولكن إذا كان لدى أي شخص آخر فكرة ، فسأكون مهتمًا جدًا!
المحلول 2
يبدو أن المشكلة هي أن MatchFilter تم تعريفه قبل نموذج الإخطار في ملف models.py. بمجرد إعادة ترتيب الملف لقراءة كما يلي ...
class WithDate(models.Model):
addedDate = models.DateTimeField(auto_now_add=True)
modifiedDate = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Match(WithDate):
...
class Notify(WithDate):
matchId = models.ForeignKey(Match)
headline = models.CharField(null=True, blank=True, max_length=10)
class MatchFilter(django_filters.FilterSet):
class Meta:
model = Match
لم أعد أحصل على fielderror.
نصائح أخرى
الاسم الافتراضي للعلاقة العكسية هو اسم النموذج_set ، لذلك يجب أن تحاول:
matchObjs = Match.objects.annotate(notifies_made=Count('notify_set'))
أو أفضل ، أضف أ الاسم ذي الصلة إلى إعلان الحقول ، ثم استخدم الاستعلام الذي كتبته:
matchId = models.ForeignKey(Match, related_name='notify')