Hi…I keep getting Intergrity error Foreign key constraint as show in the image below.
What i have done is that i have created a group in the admin panel with the superuser account and i have assigned staff members to the group with certain permissions. But whenever i login as one of the staff members and i try to add a hotel which is a model in my database, i get this intergrity error. I dont get the error when i am logged in as superuser.
This is how my hotel model.py looks like
from django.db import models
from userauths.models import User
from shortuuid.django_fields import ShortUUIDField
import shortuuid
from django.utils.text import slugify
from django.utils.html import mark_safe
from django_ckeditor_5.fields import CKEditor5Field
from taggit.managers import TaggableManager
HOTEL_STATUS = (
("Draft", "Draft"),
("Disabled", "Disabled"),
("Rejected", "Rejected"),
("In Review", "In Review"),
("Live", "Live")
)
ICON_TYPE = (
("Bootstrap Icons", "Bootstrap Icons"),
("Fontawesome Icons", "Fontawesome Icons"),
("Box Icons", "Box Icons"),
("Flat Icons", "Flat Icons"),
("Remi Icons", "Remi Icons")
)
PAYMENT_STATUS = (
("Paid", "Paid"),
("Pending", "Pending"),
("Processing", "Processing"),
("Cancelled", "Cancelled"),
("Failed", "Failed"),
("Refunding", "Refunding"),
("Refunded", "Refunded"),
("Unpaid", "Unpaid"),
("Expired", "Expired"),
)
class Hotel(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
name = models.CharField(max_length=100)
description = CKEditor5Field(null=True, blank=True, config_name='extends')
image = models.FileField(upload_to="hotel_gallery")
address = models.CharField(max_length = 200)
mobile = models.CharField(max_length = 200)
email = models.EmailField(max_length = 100)
status = models.CharField(max_length = 20, choices=HOTEL_STATUS, default='Live')
tags = TaggableManager(blank=True,)
views = models.IntegerField(default=0)
featured = models.BooleanField(default=False)
hid = ShortUUIDField(unique=True, length=10, max_length=20, alphabet='abcdefghijklmnopqrstuvwxyz')
slug = models.SlugField(unique=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if self.slug == "" or self.slug == None:
uuid_key = shortuuid.uuid()
uniqueid = uuid_key[:4]
self.slug = slugify(self.name) + '-' + str(uniqueid.lower())
super(Hotel, self).save(*args, **kwargs)
def thumbnail(self):
return mark_safe("<img src='%s' width='50' height='50 style='object-fit: cover; border-radius: 6px;' />" % (self.image.url))
def hotel_gallery(self):
return HotelGallery.objects.filter(hotel=self)
def hotel_features(self):
return HotelFeatures.objects.filter(hotel=self)
def hotel_room_types(self):
return RoomType.objects.filter(hotel=self)
class HotelGallery(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
image = models.FileField(upload_to='hotel_gallery')
hgid = ShortUUIDField(unique=True, length=10, max_length=20, alphabet='abcdefghijklmnopqrstuvwxyz')
def __str__(self):
return str(self.hotel.name)
class Meta:
verbose_name_plural = "Hotel Gallery"
class HotelFeatures(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
icon_type = models.CharField(max_length=100, null=True, choices=ICON_TYPE, blank=True)
icon = models.CharField(max_length=100, null=True, blank=True)
name = models.CharField(max_length=100, null=True, blank=True)
def __str__(self):
return str(self.name)
class Meta:
verbose_name_plural = "Hotel Features"
class HotelFaqs(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
question = models.CharField(max_length=1000)
answer = models.CharField(max_length=1000, null=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return str(self.question)
class Meta:
verbose_name_plural = "Hotel FAQs"
class RoomType(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
type = models.CharField(max_length=10)
price = models.DecimalField(max_digits=12, decimal_places=2, default=0.00)
number_of_beds = models.PositiveIntegerField(default=0)
room_capacity = models.PositiveIntegerField(default=0)
rtid = ShortUUIDField(unique=True, length=10, max_length=20, alphabet='abcdefghijklmnopqrstuvwxyz')
slug = models.SlugField(unique=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.type} - {self.hotel.name} - {self.price}"
class Meta:
verbose_name_plural = "Room Type"
def rooms_count(self):
Room.objects.filter(room_type=self).count()
def save(self, *args, **kwargs):
if self.slug == "" or self.slug == None:
uuid_key = shortuuid.uuid()
uniqueid = uuid_key[:4]
self.slug = slugify(self.name) + '-' + str(uniqueid.lower())
super(RoomType, self).save(*args, **kwargs)
class Room(models.Model):
hotel = models.ForeignKey(Hotel, on_delete=models.CASCADE)
room_type = models.ForeignKey(RoomType, on_delete=models.CASCADE)
room_number = models.CharField(max_length=1000)
is_available = models.BooleanField(default=True)
rtid = ShortUUIDField(unique=True, length=10, max_length=20, alphabet='abcdefghijklmnopqrstuvwxyz')
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.room_type.type} - {self.hotel.name}"
class Meta:
verbose_name_plural = "Rooms"
def price(self):
return self.room_type.price
def number_of_beds(self):
return self.room_type.number_of_beds
class Booking(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
payment_status = models.CharField(max_length=100, choices=PAYMENT_STATUS)
full_name = models.CharField(max_length=1000)
email = models.EmailField(max_length=100)
phone = models.CharField(max_length=100)
hotel = models.ForeignKey(Hotel, on_delete=models.SET_NULL, null=True, blank=True)
room_type = models.ForeignKey(RoomType, on_delete=models.SET_NULL, null=True, blank=True)
room = models.ManyToManyField(Room)
before_discount = models.DecimalField(max_digits=12, decimal_places=2, default=0.00)
total = models.DecimalField(max_digits=12, decimal_places=2, default=0.00)
saved = models.DecimalField(max_digits=12, decimal_places=2, default=0.00)
check_in_date = models.DateField()
check_out_date = models.DateField()
total_days = models.PositiveIntegerField(default=0)
num_adults = models. PositiveIntegerField(default=1)
num_children = models.PositiveIntegerField(default=0)
checked_in = models.BooleanField(default=False)
checked_out = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
checked_in_tracker = models.BooleanField(default=False)
checked_out_tracker = models.BooleanField(default=False)
date = models.DateTimeField(auto_now_add=True)
stripe_payment_intent = models.CharField(max_length=1000, null=True, blank=True)
success_id = models.CharField(max_length=1000, null=True, blank=True)
booking_id = ShortUUIDField(unique=True, length=10, max_length=20, alphabet='abcdefghijklmnopqrstuvwxyz')
def __str__(self):
return str(self.booking_id)
def rooms(self):
return self.room.all().count()
class ActivityLog(models.Model):
booking = models.ForeignKey(Booking, on_delete=models.CASCADE)
guess_out = models.DateTimeField()
guess_in = models.DateTimeField()
description = models.TextField(null=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.booking}"
class StaffOnDuty(models.Model):
booking = models.ForeignKey(Booking, on_delete=models.CASCADE)
staff_id = models.CharField(max_length=100, null=True, blank=True)
date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.staff_id}"
admin.py
from django.contrib import admin
from django.http.request import HttpRequest
from hotel.models import Hotel, Booking, ActivityLog, StaffOnDuty, Room, RoomType, HotelGallery, HotelFeatures
from userauths.models import User
class HotelGalleryInline(admin.TabularInline):
model = HotelGallery
class HotelFeaturesInline(admin.TabularInline):
model = HotelFeatures
class HotelAdmin(admin.ModelAdmin):
inlines =[HotelGalleryInline, HotelFeaturesInline]
list_display = ['thumbnail', 'name', 'user', 'status']
prepopulated_fields = {"slug": ("name",)}
admin.site.register(Hotel, HotelAdmin)
admin.site.register(Booking)
admin.site.register(ActivityLog)
admin.site.register(StaffOnDuty)
admin.site.register(Room)
admin.site.register(RoomType)