SerializerMethodField всегда возвращает одно и то же значение и исключает поля - PullRequest
0 голосов
/ 15 мая 2019

У меня есть API, который отправляет некоторые образцы данных.Я пытаюсь изменить представление вывода, используя SerializerMethodField () Django.Но это не работает, как ожидалось, так как я всегда получаю одни и те же данные, а поля не отображаются в моих выходных данных.

У меня есть три модели, которые выглядят так: 2 модели, связанные через внешние ключи:

class Machine(models.Model):
    machine_name            = models.CharField(max_length=120)

    def __str__(self):
        return self.machine_name
class Project(models.Model):
    project_name            = models.CharField(max_length=120)

    def __str__(self):
        return self.project_name

И одна модель, подобная этой:

class Simulation(models.Model):
    user                    = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
    machine                 = models.ForeignKey(Machine, on_delete=models.CASCADE, default=1)
    project                 = models.ForeignKey(Project, on_delete=models.CASCADE, default=1)

Я создаю данные следующим образом:

test_api_local(method="post", data={"machine":2, "project":1 })

Чего я хотел бы добиться, так это то, что когда я отправляю данные с машиной: 2, он должен записать имя этой машины2 в результат.Как 'machine' : 'machinenametwo'.

Я попробовал это с помощью SerializerMethodField.Я знаю, что это ReadOnly, но поскольку я на самом деле не изменяю данные, а только манипулирую ими, я подумал, что что-то вроде этого может работать:

class SimulationSerializer(serializers.ModelSerializer):
    machine = serializers.SerializerMethodField()
    project = serializers.SerializerMethodField()


    class Meta:
        model = Simulation

        fields = ('project',
                  'machine',     
                  )

    def get_machine(self, obj):
        print(obj.machine)
        project_name = obj.project.project_name
        return str(project_name)

Это не работает, так как мой полевой компьютер больше не появляется.Также при отладке (с этим оператором печати) я понимаю, что независимо от того, какие данные я отправляю, он всегда печатает имя моей первой машины.

Если я делаю test_api_local(method="post", data={"machine":2, "project":1 }), она печатает имя машины1.

Если я сделаю test_api_local(method="post", data={"machine":3, "project":1 }), то будет напечатано имя машины 1. Такой же результат ....

Поэтому мой вопрос будет такой: я пытаюсь сделать правильный путь?это, и если да, что я делаю не так.

Если это не так, какой будет путь?

Большое спасибо заранее за любую помощь или подсказки!

1 Ответ

2 голосов
/ 16 мая 2019

Причина, по которой вы получаете 1 для машины, заключается в том, что это значение по умолчанию для поля.Вы получаете значение по умолчанию, потому что serializers.SerializerMethodField() - это сериализатор только для чтения, поэтому он не примет ввод.Если вы используете PrimaryKeyRelatedField(), он примет ваши данные.

class SimulationSerializer(serializers.ModelSerializer):
    machine = serializers.PrimaryKeyRelatedField(queryset=Machine.objects.all())
    project = serializers.PrimaryKeyRelatedField(queryset=Project.objects.all())

    class Meta:
        model = Simulation
        fields = ('project', 'machine')
...