Детальный просмотр Django REST в размещенном контенте неправильно заполнена форма

#django #django-rest-framework

Вопрос:

У меня странная ошибка. У меня есть представление под названием «Неправильное соответствие», которое люди, использующие мое приложение, могут предложить изменить, если ссылка неверна. Это делается по почтовому запросу.

Когда я делаю неправильное сопоставление внутри просматриваемого API, я могу ввести его подробное представление, и форма PUT html заполнена правильно, но для тех, которые поступают из запроса POST, первое поле в форме PUT html по умолчанию является первой записью в базе данных. Однако для меня обе записи выглядят одинаково.

введите описание изображения здесь На этом рисунке показаны две записи, первая из которых опубликована из приложения, а вторая сделана в просматриваемом API.

введите описание изображения здесь Это показывает подробное представление первой записи, но, как видно из html-формы PUT, по умолчанию пиво является первым в базе данных, а не тем, которое указано в записи.

введите описание изображения здесь Это показывает подробное представление второй записи, добавленной из просматриваемого API. Здесь поле в форме PUT html отображается правильно.

Используемый набор представлений довольно прост.

 class WrongMatchViewSet(ModelViewSet):
    queryset = WrongMatch.objects.all()
    serializer_class = WrongMatchSerializer
    pagination_class = Pagination
    permission_classes = [permissions.AllowAny]
 

And the serializer:

 class WrongMatchSerializer(serializers.ModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="wrongmatch-detail")
    beer_name = serializers.CharField(read_only=True, source="beer.vmp_name")
    current_untpd_url = serializers.CharField(read_only=True, source="beer.untpd_url")
    current_untpd_id = serializers.CharField(read_only=True, source="beer.untpd_id")

    class Meta:
        model = WrongMatch
        fields = [
            "url",
            "beer",
            "beer_name",
            "current_untpd_url",
            "current_untpd_id",
            "suggested_url",
            "accept_change",
        ]

    def update(self, instance, validated_data):
        instance.beer = self.validated_data["beer"]
        instance.suggested_url = self.validated_data["suggested_url"]
        instance.accept_change = self.validated_data["accept_change"]

        if instance.accept_change == True:
            b = instance.beer
            b.untpd_url = instance.suggested_url
            b.untpd_id = instance.suggested_url.split("/")[-1]
            b.prioritize_recheck = True
            b.verified_match = True
            b.match_manually = False
            b.save()
            instance.delete()

        return instance
 

У кого-нибудь есть хоть малейшее представление о том, почему это происходит? Идентификатор пива указан правильно в записи поста, а имя пива и другая информация также соответствуют правильному пиву. Идея состоит в том, чтобы я просто просмотрел эти записи, установил значение «Принять изменение» в значение «истина», и изменение происходит автоматически, но когда запись о пиве неверна в форме ВВОДА, это создает беспорядок и помещает информацию туда, где ей не место.