Pregunta

Tengo un método muy simple:

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

SideNames es otro modelo definido en el mismo archivo como equipo,

¿Qué cuando intento y prueba:

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

Me sale el siguiente error:

return SideNames.objects.filter(team=self)
     

AttributeError: objeto 'NoneType' no tiene 'objetos' de atributo

pero si cambio de que la prueba sea

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

A continuación, no consigo el error. ¿Cuál es la diferencia entre llamar SideNames.objects.filter de la prueba en sí y llamar al método actual?

Como referencia, aquí están las 2 clases en su totalidad.

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)
¿Fue útil?

Solución

Por casualidad, hace su prueba algo como esto:

from myapp import models

...

models.SideNames = None

ya que es la única explicación que se me ocurre por qué deberían ser SideNames Ninguno en el contexto de ese método.

Como acotación al margen, el método en sí no tiene sentido, ya que las relaciones hacia atrás se proporcionan automáticamente por Django, por lo que sólo podría llamar t.sidenames_set.all().

Otros consejos

En el módulo que define la prueba, que va a importar el nombre SideNames de algún otro módulo. En el módulo donde se define que el método sides, el nombre SideNames no está definida o importada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top