Как выбрать UserProfileInfo пользователя с определенным PrimaryKey - Django

Я использую Django. В моей функции accept_request() я пытаюсь выбрать профиль пользователя с определенным PrimaryKey. Вот функция:

def accept_request(request, pk):
    book = Book.objects.get(id=pk)
    print(book.owner.pk)
    user = request.user
    user_email = request.user.email
    owner_profile = UserProfileInfo.objects.get(user=book.owner.pk)
    owner_house_number = owner_profile.house_number
    owner_phone_number = owner_profile.phone_number
    owner_full_name = owner_profile.full_name
    r = UserRents.objects.get(book_id=pk)
    r.status = 1
    r.save()
    subject = "{}, your request to rent the book, \"{}\", has been accepted.".format(user, book)
    body = "You had requested to rent the book, \"{}\". It's been accepted! You can head over to #{} to get the book. You can contact the owner, {}, at +91 {}. Please return the book in the same condition as it was when you got it.\n Hope you enjoy reading the book!".format(book, owner_house_number, owner_full_name, owner_phone_number)
    sender_email = "pfcbookclub@gmail.com"
    receiver_email = user_email
    password = "Zt2.~[3d*.[Y5&5r"

    # Create a multipart message and set headers
    message = MIMEMultipart()
    message["From"] = sender_email
    message["To"] = receiver_email
    message["Subject"] = subject
    message["Bcc"] = receiver_email  # Recommended for mass emails

    # Add body to email
    message.attach(MIMEText(body, "plain"))

    text = message.as_string()

    # Log in to server using secure context and send email
    context = ssl.create_default_context()
    with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
        server.login(sender_email, password)
        server.sendmail(sender_email, receiver_email, text)
    
    return redirect("/")

Это модель UserProfileInfo в models.py:

class UserProfileInfo(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)
    full_name = models.CharField(max_length=1000, blank=True)
    house_number = models.CharField(max_length=5, blank=True)
    email = EmailField(max_length=1000, blank=True)
    creation_date = models.DateTimeField(default=timezone.now)
    phone_number = models.CharField(max_length=20, blank=True, null=True)
    def __str__(self):
        return self.user.username

А вот модель Book в models.py:

class Book(models.Model):
    title = models.CharField(max_length=1000, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
    description = models.TextField()
    author = models.CharField(max_length=1000, blank=True, null=True)
    thumbnail = models.ImageField(upload_to='book_thumbnails', blank=True)
    creation_date = models.DateTimeField(default=timezone.now)
    status = IntegerField(default=1)
    min_age = models.IntegerField(blank=True, null=True)
    max_age = models.IntegerField(blank=True, null=True)
    def __str__(self):
        return self.title

Когда я перехожу на URL, который я исправил для этой функции, он выдает ошибку:

DoesNotExist at /main/accept_rent_request/1/
UserProfileInfo matching query does not exist.

Ошибка в строке, где я пытаюсь получить доступ к UserProfileInfo владельцу книги:

owner_profile = UserProfileInfo.objects.get(user=book.owner.pk)

Django не может получить доступ к профилю владельца. Что я могу сделать, чтобы решить эту проблему?

Во-первых, вы можете получить доступ к информации о профиле пользователя, выполнив

owner_profile = book.owner.userprofileinfo

Кроме того, ошибка связана с тем, что ваш UserProfileInfo не существует. Если вы хотите явно запросить его, вы можете сначала проверить, существует ли он, а затем присвоить его owner_profile

user_profile_info_query = UserProfileInfo.objects.filter(user=book.owner)
if user_profile_info_query.exists():
    owner_profile = user_profile_info_query.first()

Вы можете создать новый UserProfileInfo в оболочке и назначить пользователя ему, чтобы вы могли проверить.

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