Модели Django - как назначить в качестве ForeignKey

В моей лаборатории есть файл models.py, как показано ниже:

class Book(models.Model):
    isbn = models.CharField(max_length=10, unique=True)
    name = models.CharField(max_length=100)
    published_year = models.IntegerField()
    total_qty = models.IntegerField()
    current_qty = models.IntegerField()
    max_duration = models.IntegerField()
    author = models.ForeignKey(Author, on_delete=models.PROTECT)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    def __str__(self):
        return self.name

class BookCopy(models.Model):
    class Status:
        AVAILABLE = 1
        BORROW =2 
        LOST = 3
    barcode = models.CharField(max_length=30, unique=True)
    buy_date = models.DateField(null=True, blank=True)
    status = models.IntegerField()
    book = models.ForeignKey(Book, on_delete=models.PROTECT)
    def __str__(self):
        return self.barcode
class User(models.Model):
    username = models.CharField(max_length=30, unique=True)
    fullname = models.CharField(max_length=100, null=True)
    phone = models.CharField(max_length=10, null=True)
    def __str__(self):
        return self.fullname

class BookBorrow(models.Model):
    class Status:
        BORROWING = 1
        RETURNED = 2
    borrow_date = models.DateField()
    deadline = models.DateField()
    return_date = models.DateField(null=True)
    status = models.IntegerField()
    book_copy = models.ForeignKey(BookCopy, on_delete=models.PROTECT)
    book_name = models.ForeignKey(Book, on_delete=models.PROTECT)
    user = models.ForeignKey(User, on_delete=models.PROTECT)

И я написал API для функциизаимствования_книги, как показано ниже:

@csrf_exempt 
def muon_sach(request):
    body = request.POST 
    username = body.get('username')
    barcode = body.get('barcode')
    user = User.objects.filter(username=username).first()
    bookcopy = BookCopy.objects.filter(barcode = barcode).first()
    if not user:
        return HttpResponse(json.dumps({
            'error':"Nguoi dung khong ton tai"
        }))
    if not bookcopy:
        return HttpResponse(json.dumps({
            'error':"ma sach khong ton tai"
        }))       
    book_borrow = BookBorrow()
    # resp = []
    book_borrow.user = user
    book_borrow.book_copy = bookcopy
    book_borrow.borrow_date = datetime.now()
    book_borrow.deadline = datetime.now() + timedelta(days=bookcopy.book.max_duration)
    book_borrow.status = BookBorrow.Status.BORROWING
    book_borrow.book_name = bookcopy.book.name
    book_borrow.save()

    bookcopy.status = BookCopy.Status.BORROW
    bookcopy.save()
    bookcopy.book.current_qty -=1
    bookcopy.book.save()

    return HttpResponse(json.dumps({'success':True}))

однако, когда я тестирую с почтальоном (укажите имя пользователя и штрих-код), он получает ошибку xxx "BookBorrow.book_name" должен быть экземпляром "Book".

Не могли бы вы подсказать, где неправильно, и помочь мне исправить это? Благодарен за любую помощь

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы указали book_name как внешний ключ для Book и пытаетесь присвоить ему значение book.name.

Либо вам нужно установить это поле как CharField, либо вам нужно переименовать поле с book_name на book и использовать book_borrow.book = bookcopy.book

Ответ принят как подходящий

Вы должны сделать следующее:

@csrf_exempt 
def muon_sach(request):
    # ... more code here
    bookcopy = BookCopy.objects.filter(barcode = barcode).first()
    book_borrow.book_name = bookcopy.book
    book_borrow.save()
    # ... more code here
    return HttpResponse(json.dumps({'success':True}))

Итак, в определении вашей модели вы можете видеть, что book_name имеет следующую структуру:

class BookBorrow(models.Model):
    # ... More code here
    book_name = models.ForeignKey(Book, on_delete=models.PROTECT)
    user = models.ForeignKey(User, on_delete=models.PROTECT)

Понятно, что BookBorrow.book_name должен принимать экземпляр Book. Итак, когда вы передаете свой код book_borrow.book_copy = bookcopy, он передает экземпляр BookCopy, так что это ошибка.

borrow_copy.book подходит.

Другие вопросы по теме