Yggor
Yggor

Reputation: 81

Django rest framework serialize model with FK

I'm learning Django and Vue.js. There is something I'm not understanding how it works.

I have a model "Nc" which have some foreign key to other models like Affaire.

How can I obtain in my JSON files the str return for instances instead of the real value...

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 files :

{
        "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
    },

The result I want on 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
    },

I'm not sure the issue is to have str return on the JSON file. In fact I don't understand how I'm supposed to use Serialize with FK.

Upvotes: 1

Views: 130

Answers (2)

loicgasser
loicgasser

Reputation: 1543

You have to create a serializer for each of your foreign objects.

I would personally remove all the prefix id from idaffaire and so on from the model NC, because you are able to do something like instance.affaire.id and instance.idaffaire.id does not make much sense.

code sample:

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

Make sure you use select_related('affaire') when you create you queryset to avoid unnecessary requests to the database.

Upvotes: 1

JPG
JPG

Reputation: 88499

Use serializers.StringRelatedField() field as,

class NcSerializer(serializers.ModelSerializer):
    idaffaire = serializers.StringRelatedField()

    class Meta:
        model = NC
        fields = '__all__'

Upvotes: 1

Related Questions