2017-01-07 8 views
0

Mit Django Rest-Farmework zur Implementierung der API gibt es ein Problem in der verschachtelten Beziehung hier. Der Inhalt mit dem Fremdschlüssel zugeordnet ist, kann nicht angezeigt werden, der spezifische Code wird wie folgt:django rest-farmework verschachtelte Beziehungen

models.py

class Category(models.Model): 
    name = models.CharField(max_length=30) 
    amount = models.IntegerField() 

class Source(models.Model): 
    name = models.CharField(max_length=50) 
    rss_link = models.URLField() 
    amount = models.IntegerField() 
    # ForeignKey 
    category = models.ForeignKey(Category) 

views.py

class CategoryListView(APIView): 
    def get(self, request): 
     category = Category.objects.all() 
     serializers = CategorySerializers(category, many=True) 
     return Response(serializers.data) 

serializers.py

class SourceSerializers(serializers.ModelSerializer): 
    class Meta: 
     model = Source 
     fields = ("id","name","amount") 

class CategorySerializers(serializers.ModelSerializer): 
    source = SourceSerializers(many=True, read_only=True) 

    class Meta: 
     model = Category 
     fields = ("id","name","amount","source") 

Programm läuft Ergebnisse:

[ 
    { 
     "id": 1, 
     "name": "默认分类", 
     "amount": 0 
    }, 
    { 
     "id": 2, 
     "name": "科技频道", 
     "amount": 0 
    } 
] 

Warum kann 'Quelle' im Ergebnis nicht angezeigt werden?

Ich hoffe, dass das Ergebnis so

ist
[ 
    { 
     "id": 1, 
     "name": "默认分类", 
     "amount": "0", 
     "source": [ 
      { 
       "id": 34, 
       "name": "博客园", 
       "amount": "231" 
      }, 
      { 
       "id": 35, 
       "name": "CSDN", 
       "amount": "643" 
      } 
     ] 
    }, 
    { 
     "id": 2, 
     "name": "科技频道", 
     "amount": "0", 
     "source": [] 
    } 
] 
+1

Sie haben für die ForeignKey einen verwandten Namen nicht definieren, so dass die umgekehrte Beziehung standardmäßig so etwas wie 'source_set'. –

+0

Vielen Dank, das Problem ist gelöst. – jason

Antwort

2

Dank Klaus D Kommentare, das Problem gelöst ist. Wir related_name = 'source' im models.py wie folgt hinzufügen:

class Source(models.Model): 
    name = models.CharField(max_length=50) 
    rss_link = models.URLField() 
    amount = models.IntegerField() 
    # ForeignKey 
    category = models.ForeignKey(Category,related_name = 'source') 

Wenn Sie related_name im foreignkey nicht hinzufügen, ist die Standard „source_set“.

So können wir auch das Problem wie folgt lösen:

#serializers.py 
class CategorySerializers(serializers.ModelSerializer): 
    source_set = SourceSerializers(many=True, read_only=True) 

    class Meta: 
     model = Category 
     fields = ("id","name","amount","source_set") 
Verwandte Themen