Question

J'ai une méthode très simple:

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

SideNames est un autre modèle défini dans le même fichier que l'équipe,

Quel quand je tente de test:

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

Je reçois l'erreur suivante:

return SideNames.objects.filter(team=self)
     

AttributeError: 'objets' objet 'NoneType' n'a pas d'attribut

mais si je change le test pour être

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

Alors je ne comprends pas l'erreur. Quelle est la différence entre l'appel SideNames.objects.filter de l'essai lui-même et appeler la méthode réelle?

Pour référence, voici les 2 classes dans leur intégralité.

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)
Était-ce utile?

La solution

Par hasard, votre test de faire quelque chose comme ceci:

from myapp import models

...

models.SideNames = None

puisque c'est la seule explication que je peux penser pourquoi SideNames devrait être aucun dans le contexte de cette méthode.

En aparté, la méthode elle-même est inutile, car les relations arrière sont fournis automatiquement par Django, de sorte que vous pouvez simplement appeler t.sidenames_set.all().

Autres conseils

Dans le module qui définit le test, vous importez le nom SideNames d'un autre module. Dans le module lorsque cette méthode sides est définie, le nom SideNames est pas défini ou importé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top