Django 模型 - 如何分配为 ForeignKey

Django models - how to assign as 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)

我为 borrow_book 函数编写了 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" 实例。"

请问哪里不对请指教,帮我更正一下好吗?感谢任何帮助

您已将 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 是合适的。