Модели 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 для функции borrow_book, как показано ниже:

@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}))

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

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

Вы указали 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 является подходящим.

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