2016-04-01 4 views
1

Ich wünsche MultipleObjects zurückzukehren, aber ich bin nicht sicher, wie ich diesen Fehler erhalte:Rückkehr MultipleObjects mit get() django

MultipleObjectsReturned at /clubs/ 
get() returned more than one Player -- it returned 2! 

ich eine Liste aller Spieler zurückkehren wollen, die zu gehören Der Club gibt aber nur einen zurück (wenn ich alle anderen Spieler aus meiner Datenbank entferne, aber wenn ich den Rest des Teams hinzufüge, wird dieser Fehler ausgelöst), bin ich mir nicht sicher, wie man mehrere Objekte returnieren kann.

models.py

class Club(models.Model): 
    name = models.CharField(max_length=4096) 
    abbreviation = models.CharField(max_length=4096) 
    def __str__(self): 
     if self.player: 
      return self.player.name 
     return self.name 

class Player(models.Model): 
    name = models.CharField(max_length=4096) 
    age = models.IntegerField() 
    goals = models.IntegerField() 
    club = models.OneToOneField(Club, null=True, related_name='player') 

    def __str__(self): 
     return self.name 

views.py

class ClubViewSet(viewsets.ModelViewSet): 
    queryset = Club.objects.order_by('name') 
    serializer_class = ClubSerializer 

class PlayerViewSet(viewsets.ModelViewSet): 
    queryset = Player.objects.order_by('name') 
    serializer_class = PlayerSerializer 

serializer.py

class ClubSerializer(serializers.HyperlinkedModelSerializer): 
    player = serializers.HyperlinkedRelatedField(
     many=False, 
     read_only=True, 
     view_name='player-detail' 
    ) 
    class Meta: 
     model = Club 
     fields = ('url','name', 'abbreviation','player') 

class PlayerSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Player 
     fields = ('url', 'name', 'age', 'goals') 
+2

Verwenden [Filter] (https://docs.djangoproject.com/ja/1.9/topics/db/queries/#retrieving-specific-objects-with-filters) statt zu bekommen. –

+0

@SteinarLima das ist in diesem Fall nicht sehr hilfreich - es gibt kein 'get()' in den OPs Code. – Alasdair

Antwort

3

Sie haben eine 0.59 Feld von Spieler zu Club.

class Player(models.Model): 
    club = models.OneToOneField(Club, null=True, related_name='player') 

Sie werden auch Club __str__ Methode ändern müssen, weil es zur Zeit self.player verwendet. Ich schlage vor, dass Sie den Namen des Clubs verwenden, anstatt alle Namen der Spieler anzugeben.

class Club(models.Model): 
    ... 
    def __str__(self): 
     returns self.name 

Dies bedeutet, dass jeder Spieler zu einem Verein gehört und jeder Verein zu einem Spieler gehört.

Es wäre sinnvoller, stattdessen einen Fremdschlüssel zu verwenden. Das heißt, jeder Spieler gehört zu einem Verein, aber viele Spieler können zum selben Verein gehören.

class Player(models.Model): 
    club = models.ForeignKey(Club, null=True, related_name='players') 

Sie müssen eine Migration erstellen und ausführen, nachdem Sie diese Änderung vorgenommen haben.

Aktualisieren Sie dann Ihre Serializer, um mehrere Player zu unterstützen.

class ClubSerializer(serializers.HyperlinkedModelSerializer): 
    player = serializers.HyperlinkedRelatedField(
     many=True, 
     read_only=True, 
     view_name='player-detail' 
    ) 
    ... 
+0

zwang Unicode: brauche String oder Puffer, NoneType gefunden Ich bekomme diesen Fehler jetzt – Aceboy1993

+0

Sorry, ich habe vergessen, dass ich jetzt __str__ zu get_queryset ändern musste. – Aceboy1993

+0

Ich würde nicht empfehlen, die Spieler in der '__str__' Methode einzuschließen. Die Verwendung von 'return self.name' könnte eine bessere Idee sein. – Alasdair