Ошибка значения при сохранении данных в модели в Django

Вот мой "models.py":

class PostData(models.Model):
    #image = models.ImageField(upload_to="")
    title_name = models.CharField(max_length=255)
    description = models.CharField(max_length=10000)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    date_created = models.DateTimeField(auto_now_add=True)
    date_updated = models.DateTimeField(auto_now=True)

Вот мой "views.py":

def createPost(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        print(form.is_valid())
        if form.is_valid():
            # To extarct data from web page
            title = form.cleaned_data['title_name']
            description = form.cleaned_data['description']
            # To get username which is stored in session
            author = request.session.get("username")
            print(author)
            print(title)
            # To store Data
            PostData.objects.create(title_name=title, description=description, author=author)

И я получаю следующую ошибку: ValueError at /create/ Невозможно присвоить "'dhruv123'": "PostData.author" должен быть экземпляром "User". Как решить эту ошибку?

Ваш request.session.get("username") не является экземпляром django User.

author = User.objects.get(name = request.session.get("username"))

Зависит от вашего request.session.

В модели PostData создано отношение между моделью PostData и моделью User. Эта связь формируется через ID. То есть идентификатор пользователя хранится в таблице PostData. Таким образом, при создании PostData вы должны либо указать ей ID пользователя, либо указать экземпляр пользователя. Есть два способа:

  1. В Django, если запрашивающий пользователь вошел в систему, вы можете получить пользователя из запроса и передать экземпляр модели PostData.
PostData.objects.create(title_name=title, description=description, author=request.user)
  1. По имени пользователя сначала сделайте запрос к таблице user и получите экземпляр пользователя, затем передайте его в PostData.
author = User.objects.get(username=request.session.get('username'))

PostData.objects.create(title_name=title, description=description, author=author)

Я предлагаю вам использовать первый метод. Потому что первый метод делает на один запрос к базе данных меньше, чем второй. В результате задержка API становится меньше.

При создании записи PostData требуется, чтобы PostData.author был экземпляром User или primary_key User. Это необходимо для того, чтобы база данных могла создать отношение "Многие к одному" между PostData и User.

Вы передаете значение 'dhruv123', которое не является ни экземпляром User, ни primary_key экземпляра User. Сначала получите User, используя:

username = request.session.get("username")
user = User.objects.get(username=username)

Затем создайте PostData с полученными User:

PostData.objects.create(title_name=title, description=description, author=user) #[1]

[1] The assumption here is that User is django.contrib.auth.models.User.

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