2016-07-11 4 views
0

J'essaie de renvoyer une HttpResponse de Django Rest Framework en incluant les données de 3 modèles liés. Les modèles sontdjango DRF: comment obtenir le champ de modèle associé dans le sérialiseur

class ErrorDb(models.Model): 
    error_id = models.AutoField(primary_key=True) 
    error_msg = models.CharField(max_length=500) 
    user_name = models.CharField(max_length=45) 
    class Meta: 
     #managed = False 
     db_table = 'error_db' 

class ErrordbKey(models.Model): 
    key_id = models.AutoField(primary_key=True) 
    parent_areaid = models.IntegerField(blank=True, null=True) 

    class Meta: 
     #managed = False 
     db_table = 'errordb_key' 


class ErrordbMapping(models.Model): 
    table_id = models.AutoField(primary_key=True) 
    key = models.ForeignKey(ErrordbKey) 
    error = models.ForeignKey(ErrorDb) 
    class Meta: 
     #managed = False 
     db_table = 'errordb_mapping' 
     unique_together = (('key', 'error'),) 

Voici le views.py:

def area_detail(request, area_id): 

obj_ErrordbKey = ErrordbKey.objects.filter(parent_areaid=area_id) 
#objects to get specific rows where area_id exists 

if request.method == 'GET': 
    obj_ErrordbMapping = ErrordbMapping.objects.filter(key__in=obj_ErrordbKey) 
    serializer = TaskSerializer(obj_ErrordbMapping, many=True) 
    return Response(serializer.data) 

J'ai essayé en suivant les méthodes de sérialisation, s'il vous plaît voir la relation clé foeign navire serializers.py:

class ErrorDbSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = ErrorDb 
     fields = ('error_msg','user_name') 


class ErrordbKeySerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = ErrordbKey 
     fields = ('area', 'filename') 


class TaskSerializer(serializers.HyperlinkedModelSerializer): 
    # errorDbdata = ErrorDbSerializer() 
    # errordbKeydata = ErrordbKeySerializer() 
    error = ErrorDbSerializer(source='error') 
    key = ErrordbKeySerializer(source='key') 
    class Meta: 
     model = ErrordbMapping 
     fields = ('key', 'error') 

Répondre

2
vous

peut utiliser source de serializer.CharField et l'accès au champ lancer fk comme d'habitude:

class TaskSerializer(serializers.HyperlinkedModelSerializer): 
    error_field = serializers.CharField(read_only=True, source='error.error_msg') 
    key_field = serializers.CharField(read_only=True, source='key.parent_areaid') 
    class Meta: 
     model = ErrordbMapping 
     fields = ('error_field', 'key_field') 
+0

J'ai essayé votre code, mais je n'ai toujours pas pu obtenir de code. juste une liste vide –

+0

@ vm-power vous avez une exception ou quoi? –

+0

Je peux voir les objets de données valides à partir de la coque de django: >>> obj_ErrordbKey = ErrordbKey.objects.filter (parent_areaid = 3) >>> obj_ErrordbMapping = ErrordbMapping.objects.filter (key__in = obj_ErrordbKey) >>> obj_ErrordbMapping [, , ] –