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")

Вернуться на верх