Django Функция проверки REST Framework имеет подпись, отличную от Django моделей? - PullRequest
0 голосов
/ 02 мая 2020

Я разрабатываю систему бронирования REST api в Django с относительно простой моделью, которая будет определять, есть ли у пользователя действительное членство, чтобы он мог зарезервировать определенный элемент. При создании резервирования у меня есть простой валидатор, написанный следующим образом:

def validate_member(value):
    """
    Validator for a user in a reservation. Will throw a ValidationError if the user does not have an
    updated membership.
    """
    if not valid_membership(value):
        raise ValidationError("User does not have a valid membership!")

Эта проверка выполняется в поле внешнего ключа в таблице резервирования, которое записывается так:

    # The gear item in the reservation
    gear_item = models.ForeignKey(Entry,
                                  on_delete=models.SET_NULL,
                                  null=True,
                                  help_text="The gear item being reserved.",
                                  validators=[validate_entry]
                                  )

Сериализатор для этой модели записан в виде ModelSerializer, например:

class ReservationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Reservation
        fields = "__all__"

Этот дизайн отлично работает для запросов в REST API, но не для любых изменений в консоли администратора, с ошибкой: 'int' object has no attribute 'rentable'

Похоже, что проверка внешнего ключа в консоли администратора передает целое число первичного ключа в параметр value функции проверки, в то время как API REST передает весь объект. Есть ли обходной путь для этого, или я должен ожидать вообще не использовать консоль администратора из-за этого ограничения?

1 Ответ

0 голосов
/ 02 мая 2020

Лучшее решение / обходной путь для этого - переопределение формы вашей консоли администратора. Я думаю, этого фрагмента кода будет достаточно, чтобы вы могли обработать указанное вами поле c и его проверку.

...