Валидатор полей не вызывается в сериализаторе модели
Я совсем новичок в 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__"