Django Rest Framework Не удается сохранить модель, он говорит мне, что дата должна быть строкой
У меня есть модель профиля, к которой также прикреплено местоположение, но я не пытался сохранить местоположение, теперь я пытаюсь сохранить только профиль, но получаю ошибку:
class Profile(models.Model):
# Gender
M = 'M'
F = 'F'
O = 'O'
GENDER = [
(M, "male"),
(F, "female"),
(O, "Other")
]
# Basic information
background = models.FileField(upload_to=background_to, null=True, blank=True)
photo = models.FileField(upload_to=image_to, null=True, blank=True)
slug = AutoSlugField(populate_from=['first_name', 'last_name', 'gender'])
first_name = models.CharField(max_length=100)
middle_name = models.CharField(max_length=100, null=True, blank=True)
last_name = models.CharField(max_length=100)
birthdate = models.DateField()
gender = models.CharField(max_length=1, choices=GENDER, default=None)
bio = models.TextField(max_length=5000, null=True, blank=True)
languages = ArrayField(models.CharField(max_length=30, null=True, blank=True), null=True, blank=True)
# Location information
website = models.URLField(max_length=256, null=True, blank=True)
# owner information
user = models.OneToOneField(User, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="created at")
updated_at = models.DateTimeField(auto_now=True, verbose_name="updated at")
class Meta:
verbose_name = "profile"
verbose_name_plural = "profiles"
db_table = "user_profiles"
def __str__(self):
return self.first_name + ' ' + self.last_name
def get_absolute_url(self):
return self.slug
и это представление, которое я использую для сохранения профиля. Я пытался сначала отправить данные в сериализатор и сохранить их, но сериализатор каждый раз оказывался недействительным:
class CreateProfileView(APIView):
permission_classes = [permissions.IsAuthenticated]
def post(self, request):
data = dict(request.data)
location = {}
location.update(street=data.pop('street'))
location.update(additional=data.pop('additional'))
location.update(country=data.pop('country'))
location.update(state=data.pop('state'))
location.update(city=data.pop('city'))
location.update(zip=data.pop('zip'))
location.update(phone=data.pop('phone'))
user_id = data.pop('user')
id = int((user_id[0]))
image = data.pop('photo')
user = User.objects.get(pk=id)
print(data['birthdate'])
new_profile = Profile.objects.create(**data, user=user)
# new_location = Location.objects.create(**location, profile=new_profile)
return Response("Profile saved successfully")
а это данные, поступающие с фронтальной стороны:
0: photo → File { name: "tumblr_005ddc5e92b6818f41d4dba4bb08e77e_bbe06c5b_540.jpg", lastModified: 1670127532084, size: 91844, … }
1: first_name → "Calvin"
2: middle_name → "undefined"
3: last_name → "Cani"
4: birthdate → "1971-09-01"
5: gender → "M"
6: bio → "This is general information about me"
7: languages → ""
8: street → "street one"
9: additional → "zwartkop"
10: country → "1"
11: state → "1"
12: city → "1"
13: zip → "0186"
14: phone → "0815252165"
15: website → ""
16: user → "1"
Когда я пытаюсь сохранить профиль, я получаю следующую ошибку, на которую не могу найти ответа:
TypeError: fromisoformat: argument must be str
Что не так, пожалуйста, и как мне это исправить?
Я на самом деле хочу сначала проверить данные, а затем сохранить их, и я пытался сначала сериализовать данные, но это оказалось фатальным, поэтому я использовал другой подход. я новичок в этом и пытаюсь учиться, чтобы знать, как все это сочетается. Спасибо
Ошибка, с которой вы столкнулись, скорее всего, связана с тем, что поле birthdate
в вашей модели Profile
является полем DateField
, а значение, которое вы пытаетесь сохранить, является полем string
. Вы должны преобразовать строковое значение в объект даты, прежде чем сохранять его в поле birthdate
.
Вот пример того, как это можно сделать:
from datetime import datetime
# Your code here
class CreateProfileView(APIView):
permission_classes = [permissions.IsAuthenticated]
def post(self, request):
data = dict(request.data)
location = {}
location.update(street=data.pop('street'))
location.update(additional=data.pop('additional'))
location.update(country=data.pop('country'))
location.update(state=data.pop('state'))
location.update(city=data.pop('city'))
location.update(zip=data.pop('zip'))
location.update(phone=data.pop('phone'))
user_id = data.pop('user')
id = int((user_id[0]))
image = data.pop('photo')
user = User.objects.get(pk=id)
# Convert the string value to a date object
birthdate_str = data.pop('birthdate')
birthdate = datetime.strptime(birthdate_str, '%Y-%m-%d').date()
new_profile = Profile.objects.create(**data, birthdate=birthdate, user=user)
# new_location = Location.objects.create(**location, profile=new_profile)
return Response("Profile saved successfully")