Ошибка значения при сохранении данных в модели в 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 пользователя, либо указать экземпляр пользователя. Есть два способа:
- В Django, если запрашивающий пользователь вошел в систему, вы можете получить пользователя из запроса и передать экземпляр модели PostData.
PostData.objects.create(title_name=title, description=description, author=request.user)
- По имени пользователя сначала сделайте запрос к таблице 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
.