سؤال

ولدي طريقة بسيطة جدا:

Class Team(models.Model):
    def sides(self):
      return SideNames.objects.filter(team=self)

وSideNames هو نموذج آخر هو محدد في الملف نفسه كفريق،

ما عندما أحاول والاختبار:

self.assertEquals(len(t.sides()), 2)

وأحصل على الخطأ التالي:

<اقتباس فقرة>
return SideNames.objects.filter(team=self)
     

وAttributeError: الكائن 'NoneType "لا يوجد لديه السمة' كائنات '

ولكن إذا قمت بتغيير اختبار ليكون

self.assertEquals(len(SideNames.objects.filter(team=t)), 2)

وبعد ذلك أنا لا أحصل على الخطأ. ما هو الفرق بين الدعوة SideNames.objects.filter من الاختبار نفسه واستدعاء الأسلوب الفعلي؟

لمرجعية، وهنا الطبقات 2 في مجملها.

class Team(models.Model):
    """The model for a football team."""

    class Admin:
            pass

    def __unicode__(self):
            return u'%s' % self.name

    def is_player(self, player):
            """Checks to see if 'player' is a member if this team. Returns True if they are, or False otherwise."""

            try:
                    teamPlayer = TeamPlayers.objects.get(player=player, team=self)
                    return True
            except ObjectDoesNotExist:
                    return False

    def sides(self):
            """Return the side names for this team"""
            return SideNames.objects.filter(team=self)

    def updateSides(self, side_a, side_b):
            """Update the side names"""
            names = SideNames.objects.filter(team=self);

            a = SideNames.objects.get(name = names[0].name)
            a.name = side_a
            a.save()

            b = SideNames.objects.get(name = names[1].name)
            b.name = side_b
            b.save()

    name = models.CharField("Team Name", max_length=255)
    organiser = models.ForeignKey(User)

class SideNames(models.Model):
    """Holds the names of the sides for each team"""

    class Admin:
            pass

    def __unicode__(self):
            """Pretty print the SideNames object"""
            return self.name

    team = models.ForeignKey(Team)
    name = models.CharField(max_length=128)
هل كانت مفيدة؟

المحلول

وقبل أي فرصة، هل الاختبار لا شيء من هذا القبيل:

from myapp import models

...

models.SideNames = None

ولأن هذا هو التفسير الوحيد الذي يمكنني أن أفكر لماذا SideNames يجب أن يكون بلا في سياق هذا الأسلوب.

وبوصفها جانبا، وطريقة في حد ذاته لا معنى لها، كما يتم توفير العلاقات الوراء تلقائيا من قبل جانغو، لذلك يمكن أن مجرد دعوة t.sidenames_set.all().

نصائح أخرى

في الوحدة النمطية التي تحدد الاختبار، كنت استيراد SideNames اسم من بعض وحدة أخرى. في وحدة حيث يتم تعريف هذا الأسلوب sides، لا يتم تعريف SideNames اسم أو المستوردة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top