2016-05-16 8 views
0

Ich versuche, JSON in einem einfachen GET zurückzugeben, das eine Zeile aus einer Join-Tabelle enthält. Die Modelle:Django-REST-Anzeige gefilterte verschachtelte Ressource

class School(models.Model): 
id = models.CharField(max_length=18,primary_key=True) 
name = models.CharField(max_length=255,blank=False) 
class Meta: 
    db_table='school' 


class FKTable(models.Model): 
school = models.ForeignKey(School,blank=False, db_column='school_id', on_delete=models.CASCADE) 
name = models.CharField(max_length=45, blank=False) 
value = models.CharField(max_length=255, blank=True, null=True) 
class Meta: 
    db_table='fk_table' 

Und der Serializer:

class SchoolListSerializer(serializers.ModelSerializer): 
id = serializers.CharField(source='id') 
name = serializers.CharField(source='name') 
fkColumn = ???? 
class Meta: 
    model = models.School 
    fields = ('id','name','fkColumn') 

Das Problem ist, ich möchte auch die verschachtelte Ressource filtern, die ich beitreten gegen auf der Spalte ‚Name‘, also weiß ich nicht, was Setzen Sie für 'fkColumn' in den Serializer. In SQL wäre es etwa so aussehen:

SELECT school.*, fk_table.value from school INNER JOIN fk_table on 
fk_table.school_id = school.id AND fk_table.name = 'some name' 

Das JSON Endergebnis ich will, ist:

{ 
"schools": [ 
    { 
     "id": "someId", 
     "name": "someName", 
     "fkColumn": "Value" 
    }]} 

RelatedField nicht der Dokumentation zu arbeiten und keine scheint scheint eine solide Antwort zu geben, wie um dies zu tun. Irgendwelche Ideen?

Antwort

0

Überarbeitet nach Klärung. Definieren Sie eine fkeySerializer:

class fkeySerializer(serializers.ModelSerializer): 
    ... 

Dann verbinden Sie dies in Ihrem Haupt-Serializer:

fkey = fkeySerializer(many=True) 

class Meta: 
     model = models.School 
     fields = ('id','name','fkColumn',) 

Sie hier ein MethodField Serializer verwenden können. Zum Beispiel:

fkColumn = serializers.SerializerMethodField() 

def get_fkColumn(self, obj): 
    return obj.fkColumn 

class Meta: 
    model = models.School 
    fields = ('id','name','fkColumn',) 

Als Nebenwirkung, vielleicht gibt es einen guten Grund dafür, aber es könnte einfacher sein, diese Tabelle umbenennen leichter lesbar

+0

sein Dieser nicht ganz erfüllen, was ich Ich suche nach, weil dies eine Eins-zu-Viele-Beziehung ist, und daher gibt es eine Reihe von Zeilen aus 'fkColumn' und ich muss nur eine von ihnen basierend auf dem Wert aus einer der Spalten erhalten. –

+0

ok, ich habe eine Notiz hinzugefügt, um zu erklären, wie man den Serializer verschachtelt – djq

Verwandte Themen