2017-07-09 3 views
1

J'ai 2 modèles ici Tag and Question. Tout ce que je veux est de sérialiser le modèle de balise sans explicitement dans le sérialiseur de question où le modèle de balise est lié par la relation de ManyToMany avec le modèle de question.Sérialiser ManyToManyField dans DjangoRestFramework

class Question(models.Model): 
    question = models.TextField(blank=False, null=False) 
    question_image = models.ImageField(blank=True, null=True, upload_to='question') 
    opt_first = models.CharField(max_length=50, blank=False, null=False) 
    opt_second = models.CharField(max_length=50, blank=False, null=False) 
    opt_third = models.CharField(max_length=50, blank=False, null=False) 
    opt_forth = models.CharField(max_length=50, blank=False, null=False) 
    answer = models.CharField(max_length=1, choices=(('1','1'),('2','2'),('3','3'),('4','4'))) 
    description = models.TextField(blank=True,null=True) 
    tag = models.ManyToManyField(Tag) 
    created_on = models.DateTimeField(default= timezone.now) 

class Tag(models.Model): 
    name = models.CharField(max_length = 50, null=False, unique=True) 

et moi avons des classes de sérialiseurs pour ces deux modèles

class TagSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Tag 
     fields = ('name',) 

class QuestionSerializer(serializers.ModelSerializer): 
    # tag = TagSerializer(many=True) 
    def to_representation(self, obj): 
     rep = super(QuestionSerializer, self).to_representation(obj) 
     rep['tag'] = [] 
     for i in obj.tag.all(): 
      # rep['tag'].append({'id':i.id,'name':i.name}) 
      # Below doesn't give JSON representation produces an error instead 
      rep['tag'].append(TagSerializer(i)) 
     return rep 

    class Meta: 
     model = Question 
     fields = ('question', 'question_image', 'opt_first', 'opt_second', 'opt_third', 'opt_forth', 'answer', 'description', 'tag') 
     read_only_fields = ('created_on',) 

Ici sur l'utilisation TagSerializer dans la méthode to_repesentation de QuestionSerializer ne sérialise pas l'objet de la balise. Au lieu de cela produit une erreur
ExceptionValue : TagSerializer(<Tag: Geography>): name = CharField(max_length=50, validators=[<UniqueValidator(queryset=Tag.objects.all())>]) is not JSON serializable

Répondre

1

Vous essayez de sérialiser TagSerializer classe. Essayez de modifier le code pour sérialiser données:

for i in obj.tag.all(): 
     # rep['tag'].append({'id':i.id,'name':i.name}) 
     # Below doesn't give JSON representation produces an error instead 
     ser = TagSerializer(i) 
     rep['tag'].append(ser.data) 

Aussi je n'ai pas pourquoi vous remplacez la méthode to_representation. juste essayer de définir le terrain tag dans QuestionSerializer:

tag = TagSerializer(read_only=True, many=True) 
+1

Je veux le rendre accessible en écriture aussi pour l'affichage de données imbriquées. –