【问题标题】:Django reverse relations serializationDjango反向关系序列化
【发布时间】:2020-03-24 01:19:04
【问题描述】:

我有多对多关系,我想序列化反向关系。

这是我的模型:

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

这是我的序列化程序:

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

我得到一个错误:

NameError:名称“CompanySerializer”未定义

【问题讨论】:

  • 这不会返回 "Infinite nested serialized" 结果,对吗?
  • 我不知道)。 “直接关系”(在我的情况下为 Nutritions_list)按预期工作。我不知道如何处理反向...
  • NameError 是你从 Python 本身得到的。
  • 这是什么意思?看来我没有打错什么。

标签: django serialization django-rest-framework many-to-many relational-database


【解决方案1】:

您收到名称错误是因为您调用了CompanySerializer:

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

在定义之前(下面几行):

class CompanySerializer(serializers.ModelSerializer):
    ...

我建议做的是为Company 添加另一个不包括NutritionSerializer 的序列化程序,这样您就可以将它放在NutritionSerializer 和CompanySerializer 之上。下面是它的外观:

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

【讨论】:

  • 没办法。解决方法很简单……过了一天半还是想不通。
  • 很高兴我能帮上忙:D
猜你喜欢
  • 1970-01-01
  • 2021-05-05
  • 1970-01-01
  • 2016-05-19
  • 2018-08-31
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-27
相关资源
最近更新 更多