Django rest framework для задач бронирования конференц-залов

Мне необходимо реализовать следующие задачи:

  • Создать сотрудника
  • Создать переговорную комнату
  • Получение резервирования переговорных комнат и возможность фильтрации по сотрудникам
  • Создать резервацию (резервация имеет название, даты от и до, сотрудников)

Итак, сначала я создал 2 приложения Employees и Reservations, это модель сотрудников (Employees/models.py) :

from django.db import models
from phonenumber_field.modelfields import PhoneNumberField
from django.contrib.auth.models import AbstractBaseUser,PermissionsMixin,BaseUserManager


# Creating the CustomUserManager 
class CustomUserManager(BaseUserManager):
    def _create_user(self, email, password, first_name, last_name, mobile, **extra_fields):
        if not email:
            raise ValueError("An Email must be provided")
        if not password:
            raise ValueError("The Password is mendatory")

        user = self.model(
            email = self.normalize_email(email),
            first_name = first_name,
            last_name = last_name,
            mobile = mobile,
            **extra_fields
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password, first_name, last_name, mobile, **extra_fields):
        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_active',True)
        extra_fields.setdefault('is_superuser',False)
        return self._create_user(email, password, first_name, last_name, mobile, password, **extra_fields)

    def create_superuser(self, email, password, first_name, last_name, mobile, **extra_fields):
        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_active',True)
        extra_fields.setdefault('is_superuser',True)
        return self._create_user(email, password, first_name, last_name, mobile, **extra_fields)

# Creating User Model
class User(AbstractBaseUser,PermissionsMixin):
    # Abstractbaseuser has password, last_login, is_active by default

    email = models.EmailField(db_index=True, unique=True, max_length=50)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=25)
    mobile = PhoneNumberField(null=False)
    address = models.CharField( max_length=250)

    is_staff = models.BooleanField(default=True) 
    is_active = models.BooleanField(default=True) 
    is_superuser = models.BooleanField(default=False) 

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name','last_name','mobile']

    def __str__(self):
        return f"Employee: {self.last_name}"

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

Это Reservations/models.py :

from django.db import models
from django.contrib.auth import get_user_model
import uuid

# Create your models here.
User = get_user_model()


class MeetingRoom(models.Model):

    public_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True, blank=False, null=False, max_length=36)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)
    #reservations = models.ManyToManyField(MeetingRoomsReservations, blank=True)
    room_code = models.CharField(max_length=128, null=False, blank=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = "MeetingRoom"

    def __str__(self):
        return str(self.id)


class Reservation(models.Model):
    STATUS_VALID = 0
    STATUS_CANCELLED = 1
    STATUS_TYPES = [ (STATUS_VALID, "Valid"), (STATUS_CANCELLED, "Cancelled"),]

    meeting_id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False )
    room = models.ForeignKey( MeetingRoom, related_name="reservations", on_delete=models.CASCADE )
    organizer = models.ForeignKey(User, related_name="organized_reservations", on_delete=models.CASCADE)
    invitees = models.ManyToManyField(User, through="ReservationInvitee")
    title = models.CharField(max_length=150)
    status = models.IntegerField(choices=STATUS_TYPES, default=STATUS_VALID )
    date_from = models.DateTimeField()
    date_to = models.DateTimeField()

class ReservationInvitee(models.Model):
    IS_PENDING = -1
    IS_ATTENDING = 1
    IS_NOT_ATTENDING = 0
    ATTENDING_STATUSES = [(IS_PENDING, "Pending"), (IS_ATTENDING, "Attending"), (IS_NOT_ATTENDING, "Not attending")]

    reservation = models.ForeignKey(Reservation, on_delete=models.CASCADE)
    employee = models.ForeignKey( User, related_name="invited_reservations", on_delete=models.CASCADE)
    status = models.IntegerField(choices=ATTENDING_STATUSES, default=IS_PENDING)

Затем я создал сериализаторы в Reservations/serializers.py и Employees/serializers.py :

from .models import MeetingRoom, Reservation, ReservationInvitee
from rest_framework import serializers

 
class ReservationSerializer(serializers.ModelSerializer):
  class Meta:
    model = Reservation
    fields = ('organizer', 'Meeting_id', 'room', 'status', 'title', 'date_from', 'date_to')


class MeetingRoomSerializer(serializers.ModelSerializer):
  class Meta:
    model = MeetingRoom
    fields = ('created_by', 'room_id', 'created_at')
    extra_kwargs = {'room_id': {'write_only': True, 'min_length': 8}}

class ReservationInviteeSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReservationInvitee
        fields = "__all__"
        read_only_fields = ('id',)
from .models import User
from rest_framework import serializers


class EmployeeSerializer(serializers.ModelSerializer):
 class Meta:
   model = User
   fields = ('id', 'Email', 'first_name', 'last_name', 'mobile')

Когда я начал с представлений для приложения Employees (Employees/views.py):

from django.shortcuts import render
from rest_framework import generics, status
from rest_framework.response import Response
from . import serializers

# Create your views here.
class HelloAuth(generics.GenericAPIView):
    def get(self, request):
        return Response(data={"message":"Welcom"}, status=status.HTTP_200_OK)

class EmployeeView(generics.GenericAPIView):
    serializer_class=serializers.EmployeeSerializer

    def post(self,request):

        serializer=self.serializer_class(data=request.data)

        if serializer.is_valid():
            serializer.save()

            return Response(data=serializer.data,status=status.HTTP_201_CREATED)

        return Response(data=serializer.errors,status=status.HTTP_400_BAD_REQUEST)

это Employees/urls.py и Main_app/urls.py

from django.urls import path
from . import views 

urlpatterns = [
    path('', views.HelloAuth.as_view(), name='hello_auth'),
    path('signup/',views.EmployeeView.as_view(),name='sign_up'),

]
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('auth/', include('Employees.urls')),
]

Теперь, когда я начал с проверки, прежде чем идти дальше, я получаю следующую ошибку :

Traceback (most recent call last):
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\django\core\handlers\base.py", line 220, in _get_response
    response = response.render()
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\django\template\response.py", line 114, in render
    self.content = self.rendered_content
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\response.py", line 70, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\renderers.py", line 724, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\renderers.py", line 655, in get_context
    raw_data_post_form = self.get_raw_data_form(data, view, 'POST', request)
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\renderers.py", line 563, in get_raw_data_form
    data = serializer.data.copy()
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 555, in data
    ret = super().data
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 257, in data
    self._data = self.get_initial()
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 405, in get_initial
    for field in self.fields.values()
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\django\utils\functional.py", line 49, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 356, in fields
    for key, value in self.get_fields().items():
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 1076, in get_fields
    field_class, field_kwargs = self.build_field(
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 1222, in build_field
    return self.build_unknown_field(field_name, model_class)
  File "C:\Users\aniss\Desktop\Karima\reservation_api\my_venv\lib\site-packages\rest_framework\serializers.py", line 1340, in build_unknown_field
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: Field name `Email` is not valid for model `User`.

Возможно, вы неправильно указали имя поля в Employees/serializers.py

from .models import User
from rest_framework import serializers


class EmployeeSerializer(serializers.ModelSerializer):
 class Meta:
   model = User
   # Change 'Email' to 'email'
   fields = ('id', 'email', 'first_name', 'last_name', 'mobile')
Вернуться на верх