Django остальные рамки сериализуют модель с FK - PullRequest
1 голос
/ 21 апреля 2020

Я учусь Django и Vuejs. Есть кое-что, что я не понимаю, как это работает.

У меня есть модель "N c", у которой есть некоторый внешний ключ к другим моделям, таким как 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'

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

Результат, который я хочу получить 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 возврат файла JSON. На самом деле я не понимаю, как я должен использовать Serialize с FK.

Спасибо

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Вы должны создать сериализатор для каждого из ваших посторонних объектов.

Я бы лично удалил весь префикс id из idaffaire и т. Д. Из модели 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') при создании набора запросов, чтобы избежать ненужных запросы к базе данных.

1 голос
/ 21 апреля 2020

Используйте serializers.StringRelatedField() поле как,

class NcSerializer(serializers.ModelSerializer):
    <b>idaffaire = serializers.StringRelatedField()</b>

    class Meta:
        model = NC
        fields = '__all__'
...