Search code examples
djangoserializationdjango-rest-frameworkmany-to-manyrelational-database

Django reverse relations serialization


I have many-to-many relations and I want to serialize reverse relations.

Here are my models:

class Nutrition(models.Model):
  name = models.CharField(max_length=30, blank=False)

  def __str__(self):
    return self.name

class Company(models.Model):
   name = models.CharField(max_length=30, blank=False)
   nutritions = models.ManyToManyField(Nutrition, blank=True, related_name="companyID")

   def __str__(self):
     return self.name

And here are my serializers:

class NutritionSerializer(serializers.ModelSerializer):
  companyID = CompanySerializer(read_only=True, many=True)

  class Meta:
    model = Nutrition
    fields=('id', 'name', 'companyID')

class CompanySerializer(serializers.ModelSerializer):
  nutritions_list = NutritionSerializer(source="nutritions", read_only=True, many=True)

  class Meta:
    model = Company
    fields = ('id', 'name', 'nutritions_list')

And I'm getting an error:

NameError: name 'CompanySerializer' is not defined


Solution

  • You are getting the name error because you call CompanySerializer:

    class NutritionSerializer(serializers.ModelSerializer):
        companyID = CompanySerializer(read_only=True, many=True)
        ...
    

    before defining it (a couple of lines under):

    class CompanySerializer(serializers.ModelSerializer):
        ...
    

    What i would suggest doing is adding another serializer for Company which does not include NutritionSerializer so you can place it above both NutritionSerializer and CompanySerializer. Here is how it would look:

    class SimpleCompanySerializer(serializers.ModelSerializer):
        class Meta:
            model = Company
            fields = ('id', 'name')
    
    class NutritionSerializer(serializers.ModelSerializer):
        company = SimpleCompanySerializer(read_only=True, many=True)
    
        class Meta:
            model = Nutrition
            fields=('id', 'name', 'company')
    
    class CompanySerializer(serializers.ModelSerializer):
        nutritions_list = NutritionSerializer(source="nutritions", read_only=True, many=True)
    
        class Meta:
            model = Company
            fields = ('id', 'name', 'nutritions_list')