Frage

Ich habe eine sehr einfache Methode:

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

SideNames ist ein weiteres Modell in der gleichen Datei als Team definiert,

Was, wenn ich versuche und Test:

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

ich die folgende Fehlermeldung erhalten:

return SideNames.objects.filter(team=self)
     

Attribute: 'NoneType' Objekt hat kein Attribut 'Objekte'

aber wenn ich den Test ändern sein

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

Dann bekomme ich den Fehler nicht. Was ist der Unterschied zwischen SideNames.objects.filter vom Test selbst aufrufen und die aktuelle Methode aufrufen?

Als Referenz, hier sind die zwei Klassen in ihrer Gesamtheit.

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

Lösung

Durch eine Chance, tut Ihr Test etwas tun, wie folgt aus:

from myapp import models

...

models.SideNames = None

denn das ist die einzige Erklärung, die ich von denken kann, warum SideNames keine im Rahmen dieses Verfahrens sein sollte.

Als Nebenwirkung, die Methode selbst ist sinnlos, wie rückwärts Beziehungen automatisch von Django zur Verfügung gestellt werden, so dass Sie nur t.sidenames_set.all() nennen könnten.

Andere Tipps

In dem Modul, das den Test definiert, importieren Sie den Namen SideNames von einem anderen Modul. In dem Modul, in dem die sides Methode definiert ist, wird der Name SideNames nicht definiert oder importiert werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top