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

Upvotes: 0

Views: 687

Answers (1)

Toni Sredanović
Toni Sredanović

Reputation: 2412

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')

Upvotes: 1

Related Questions