Reputation:
I have a couple of models named User, Book, Issue. Model Book has a field named remaining which holds the value of the number of available books.
what I want:
When there is zero book available, Issuing a book is closed.
models.py
from django.db import models
from datetime import date, timedelta, datetime
class Book(models.Model):
name = models.CharField(max_length=30)
author_name = models.CharField(max_length=30)
category = models.CharField(max_length=30)
remaining = models.IntegerField()
def __str__(self):
return self.name
class Issue(models.Model):
issue_id = models.CharField(max_length=10)
roll = models.ForeignKey(User, on_delete=models.CASCADE)
book_name = models.ForeignKey(Book, on_delete=models.CASCADE)
issue_date = models.DateField(auto_now=False, auto_now_add=True)
def save(self, *args, **kwargs):
if not self.pk:
super().save(*args, **kwargs)
if self.book_name.remaining > 0:
self.book_name.remaining -= 1
self.book_name.save()
elif self.book_name.remaining == 0:
print('hi')
else:
super().save(*args, **kwargs)
admin.py
from django.contrib import admin
from django.contrib.auth.models import Group
from .models import User, Book, Issue
class BookAdmin(admin.ModelAdmin):
list_display = ('name', 'author_name', 'remaining', 'category')
list_filter = ('category', 'author_name')
search_fields = ('name', 'author_name')
class IssueAdmin(admin.ModelAdmin):
list_display = ('issue_id', 'issue_date', 'return_date', 'fine',)
list_filter = ('issue_date',)
search_fields = ('issue_id',)
admin.site.register(Book, BookAdmin)
admin.site.register(Issue, IssueAdmin)
I want to Implement this in Admin Dashboard
Regards
Upvotes: 2
Views: 95
Reputation: 996
On the clean function just check to see if the books are available. And raise validation error if there are not any available.
def clean(self, *args, **kwargs):
from django.core.exceptions import ValidationError
super().clean()
if self.book_name.remaining < 1:
raise ValidationError("No books available")
else:
self.book_name.remaining -= 1
self.book_name.save()
Upvotes: 1