【问题标题】:Django rest framework serialize model with FKDjango rest框架用FK序列化模型
【发布时间】:2020-04-21 16:14:06
【问题描述】:

我正在学习 Django 和 Vue.js。有些东西我不明白它是如何工作的。

我有一个模型“Nc”,它对其他模型(如 Affaire)有一些外键。

如何在我的 JSON 文件中获取 str 返回实例而不是实际值...

models.py:

class Affaires(models.Model):
    id = models.PositiveSmallIntegerField(primary_key=True)
    nom = models.CharField(max_length=50)
    adresse = models.CharField(max_length=100, blank=True, null=True)
    cp = models.CharField(max_length=5, blank=True, null=True)
    ville = models.CharField(max_length=50, blank=True, null=True)
    dessinateur = models.PositiveSmallIntegerField(blank=True, null=True)
    conducteur = models.PositiveSmallIntegerField(blank=True, null=True)
    chefdeprojet = models.PositiveSmallIntegerField(blank=True, null=True)
    cloture = models.IntegerField()


    class Meta:
        managed = True
        db_table = 'affaires'

    def __str__(self):
        return '{} - {}'.format(self.id, self.nom)

class NC(models.Model):
    idaffaire = models.ForeignKey(Affaires, models.DO_NOTHING,verbose_name="N° d'affaire", db_column='idAffaire')
    idof = models.ForeignKey(AffairesOfs, models.DO_NOTHING,verbose_name="N° d'OF", db_column='idOf')
    idposte = models.ForeignKey(ProductionPostes, models.DO_NOTHING,verbose_name="Poste", db_column="idPoste")
    idrepere = models.ForeignKey(AffairesReperes, models.DO_NOTHING,verbose_name="Repère", db_column='idRepere')
    idnc = models.ForeignKey(Nc_type, models.DO_NOTHING,verbose_name="Type de NC", db_column='idNc_type')
    quantite = models.PositiveIntegerField(verbose_name="Quantité")
    dateajout = models.DateField(default=timezone.now, verbose_name="Date d'ajout", db_column='dateAjout')

    class Meta:
        managed = True
        db_table = 'qualite_Nc'

序列化.py

class NcSerializer(serializers.ModelSerializer):

    class  Meta:
        model = NC
        fields = '__all__'

JSON 文件:

{
        "id": 1,
        "quantite": 1,
        "dateajout": "2020-04-08",
        "idaffaire": 1145,
        "idof": 1433,
        "idposte": 6271,
        "idrepere": 5361,
        "idnc": 1
    },
    {
        "id": 2,
        "quantite": 17,
        "dateajout": "2020-04-09",
        "idaffaire": 1205,
        "idof": 1290,
        "idposte": 5812,
        "idrepere": 7004,
        "idnc": 1
    },

我想要的 JSON 结果:

{
        "id": 1,
        "quantite": 1,
        "dateajout": "2020-04-08",
        "idaffaire": 1145 - CORTIS,
        "idof": 1433,
        "idposte": 6271,
        "idrepere": 5361,
        "idnc": 1
    },
    {
        "id": 2,
        "quantite": 17,
        "dateajout": "2020-04-09",
        "idaffaire": 1205 - GS Cergy,
        "idof": 1290,
        "idposte": 5812,
        "idrepere": 7004,
        "idnc": 1
    },

我不确定问题是否在 JSON 文件中返回 str。事实上,我不明白我应该如何将 Serialize 与 FK 一起使用。

【问题讨论】:

    标签: python django django-rest-framework django-serializer


    【解决方案1】:

    您必须为每个外来对象创建一个序列化程序。

    我会亲自从模型idaffaire 中删除所有前缀id 等等,因为您可以执行instance.affaire.idinstance.idaffaire.id 之类的操作没有多大意义。

    代码示例:

    class AffairesSerializer(serializers.ModelSerializer):
    
        class  Meta:
            model = Affaires
            fields = '__all__'
    
    class NcSerializer(serializers.ModelSerializer):
        affaire = AffairesSerializer(read_only=True)
    
        class  Meta:
            model = NC
            fields = '__all__'
    

    确保在创建查询集时使用select_related('affaire') 以避免对数据库的不必要请求。

    【讨论】:

      【解决方案2】:

      使用serializers.StringRelatedField() 字段作为,

      class NcSerializer(serializers.ModelSerializer):
          idaffaire = serializers.StringRelatedField()
      
          class Meta:
              model = NC
              fields = '__all__'

      【讨论】:

      • 非常感谢!
      猜你喜欢
      • 1970-01-01
      • 2016-04-07
      • 2012-11-16
      • 1970-01-01
      • 2014-07-26
      • 2017-06-25
      • 2013-03-31
      • 2018-06-18
      • 1970-01-01
      相关资源
      最近更新 更多