Django rest 框架使用 FK 序列化模型
Django rest framework serialize model with FK
我正在学习 Django 和 Vue.js。有些东西我不明白它是如何工作的。
我有一个模型“Nc”,它有一些外键可以连接到其他模型,例如 Affaire。
如何在我的 JSON 文件中获取实例的 str return 而不是实际值...
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'
serialize.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
},
我不确定问题是 str return 在 JSON 文件上。事实上,我不明白我应该如何使用 FK 序列化。
使用 serializers.StringRelatedField()
字段作为,
class NcSerializer(serializers.ModelSerializer):
<b>idaffaire = serializers.StringRelatedField()</b>
class Meta:
model = NC
fields = '__all__'
您必须为每个外部对象创建一个序列化程序。
我个人会从 idaffaire
中删除所有前缀 id
,然后从模型 NC
中删除所有前缀,因为您可以执行 instance.affaire.id
和 instance.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')
以避免对数据库进行不必要的请求。
我正在学习 Django 和 Vue.js。有些东西我不明白它是如何工作的。
我有一个模型“Nc”,它有一些外键可以连接到其他模型,例如 Affaire。
如何在我的 JSON 文件中获取实例的 str return 而不是实际值...
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'
serialize.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
},
我不确定问题是 str return 在 JSON 文件上。事实上,我不明白我应该如何使用 FK 序列化。
使用 serializers.StringRelatedField()
字段作为,
class NcSerializer(serializers.ModelSerializer):
<b>idaffaire = serializers.StringRelatedField()</b>
class Meta:
model = NC
fields = '__all__'
您必须为每个外部对象创建一个序列化程序。
我个人会从 idaffaire
中删除所有前缀 id
,然后从模型 NC
中删除所有前缀,因为您可以执行 instance.affaire.id
和 instance.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')
以避免对数据库进行不必要的请求。