Валидатор полей не вызывается в сериализаторе модели

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

import os
import json
import requests

# Assuming the JSON content is stored in a variable named 'films_json'
json_file_path: str = os.path.join(os.getcwd(), "films.json")

# Load the JSON content from the file
with open(json_file_path, "r") as file:
    films_json: dict = json.load(file)

# URL of the endpoint
endpoint_url = "http://127.0.0.1:8000/site-admin/add-film/"

for film_data in films_json["films"]:
    print()
    print(json.dumps(film_data, indent=4))
    response: requests.Response = requests.post(endpoint_url, json=film_data)
    if response.status_code == 201:
        print(f"Film '{film_data['name']}' added successfully")
    else:
        print(f"Failed to add film '{film_data['name']}':")
        print(json.dumps(dict(response.headers),indent=4))
        print(f"{json.dumps(response.json(), indent=4)}")

Я получаю следующий ответ (для каждого фильма):

{
    "name": "Pulp Fiction",
    "genre": "Crime",
    "duration": 154,
    "director": "Quentin Tarantino",
    "cast": [
        "John Travolta",
        "Uma Thurman",
        "Samuel L. Jackson",
        "Bruce Willis"
    ],
    "description": "The lives of two mob hitmen, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
    "image_url": "https://m.media-amazon.com/images/M/MV5BNGNhMDIzZTUtNTBlZi00MTRlLWFjM2ItYzViMjE3YzI5MjljXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_.jpg",
    "release": "1994-00-00"
}
Failed to add film 'Pulp Fiction':
Bad Request
{
    "Date": "Fri, 03 May 2024 22:35:32 GMT",
    "Server": "WSGIServer/0.2 CPython/3.10.10",
    "Content-Type": "application/json",
    "Vary": "Accept, Cookie",
    "Allow": "POST, OPTIONS",
    "djdt-store-id": "bf9dc157db354419a70d69f3be5e8dd7",
    "Server-Timing": "TimerPanel_utime;dur=0;desc=\"User CPU time\", TimerPanel_stime;dur=0;desc=\"System CPU time\", TimerPanel_total;dur=0;desc=\"Total CPU time\", TimerPanel_total_time;dur=50.99039999186061;desc=\"Elapsed time\", SQLPanel_sql_time;dur=2.606799971545115;desc=\"SQL 14 queries\", CachePanel_total_time;dur=0;desc=\"Cache 0 Calls\"",
    "X-Frame-Options": "DENY",
    "Content-Length": "197",
    "X-Content-Type-Options": "nosniff",
    "Referrer-Policy": "same-origin",
    "Cross-Origin-Opener-Policy": "same-origin"
}
{
    "release": [
        "Date has wrong format. Use one of these formats instead: YYYY-MM-DD."
    ],
    "director_id": [
        "Invalid pk \"1\" - object does not exist."
    ],
    "cast": [
        "Invalid pk \"2\" - object does not exist."
    ]
}

Вот мое мнение:

Это мой сериализатор:

А это моя модель:

class Film(models.Model):

    GENRE_CHOICES: list[str] = [
        "Action",
        "Comedy",
        "Crime",
        "Doctumentary",
        "Drama",
        "Horror",
        "Romance",
        "Sci-Fi",
        "Thriller",
        "Western",
    ]

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=64, unique=True)
    release = models.DateField()
    genre = models.CharField(max_length=64)
    description = models.TextField()
    duration = models.FloatField()
    director_id = models.ForeignKey(
        User, on_delete=models.CASCADE, related_name="director"
    )
    cast = models.ManyToManyField(User, related_name="cast")

Проблема в том, что поле release получает отказ в проверке, отличной от той, которую я определил в сериализаторе, и недействительность, о которой он сообщает, должна быть предотвращена изменением значения, которое должен сделать мой метод validate_release.

Дело в том, что метод validate_release не вызывается, что можно увидеть в терминале, на котором запущен сервер:

###     <class 'dict'>
[<class 'str'>, <class 'str'>, <class 'int'>, <class 'str'>, <class 'str'>, <class 'str'>, <class 'int'>, <class 'list'>]
{'name': 'Pulp Fiction', 'genre': 'Crime', 'duration': 154, 'description': "The lives of two mob hitmen, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.", 'image_url': 'https://m.media-amazon.com/images/M/MV5BNGNhMDIzZTUtNTBlZi00MTRlLWFjM2ItYzViMjE3YzI5MjljXkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_.jpg', 'release': '1994-00-00', 'director_id': 1, 'cast': [2, 3, 4, 5]}
Name validation Pulp Fiction
Genre validation Crime
Description validation The lives of two mob hitmen, a boxer, a gangster's wife, and a pair of diner bandits intertwine in four tales of violence and redemption.
Bad Request: /site-admin/add-film/
[04/May/2024 00:36:34] "POST /site-admin/add-film/ HTTP/1.1" 400 197

Есть идеи, как это исправить?

Because ModelSerializer сопоставит release поле с DateField. Таким образом, проверка выполняется по форматам даты ввода по умолчанию, установленным фреймворком.

Для того чтобы переопределить это, вам нужно задать свой собственный список допустимых входов (я сделаю это в settings.py, но, конечно, это может быть где угодно).

DATE_INPUT_FORMATS = [
    "%Y",
    "%Y-%m",
    "%m-%Y",
    "%Y-%m-%d",
    "%d-%m-%Y",
]

serializers.py

class FilmSerializer(serializers.ModelSerializer):
    release = serializers.DateField(input_formats=settings.DATE_INPUT_FORMATS)

    class Meta:
        model = Film
        fields = "__all__"
Вернуться на верх