[PYTHON] Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Entwurf des Datenbankmodells)

** Dies ist eine Fortsetzung von Letztes Mal (korrigiert am 4. April 2014). ** **.

1. Auswahl der notwendigen Daten

Zuerst dachte ich darüber nach, welche Art von Daten die App benötigen könnte. Die Informationen, die benötigt werden, um über Schichten nachzudenken, werden wahrscheinlich grob in zwei Typen unterteilt.

In jedem Fall gibt es grundlegende Informationen wie Namen, persönliche Informationen, die schwer auszudrücken sind, wie Daten wie Erfahrung und Fähigkeiten für Mitarbeiter, vergangene Karriere und Persönlichkeit für Benutzer, aber ** Im Moment die früheren Grundlagen Informationen sind genug. ** Persönliche Informationen wie diese sollten allen Mitarbeitern der Einrichtung bekannt sein, daher halte ich es nicht für erforderlich, sie in Daten zu zwingen.

Deshalb habe ich vorerst versucht, es so einfach wie möglich zu halten.

Mitarbeiter

Nutzer

Danach müssen Sie die Daten des tatsächlich erstellten Zeitplans speichern.

Zeitplan

Definieren Sie außerdem den Schichttabellenadministrator (Editor) und die Mitarbeiter (Viewer). Es wäre ein Problem, wenn jeder, der darauf zugegriffen hat, es anzeigen und bearbeiten könnte.

Inhaber

Wie oben erwähnt, werde ich es so machen.

2. Modelldefinition

startprojectNach dem Erstellen eines Django-Projekts instartappMachen Sie eine App mit.

Ich hatte das Gefühl, dass eine App ausreichen würde, aber ich mochte sie nicht, weil sie später chaotisch zu sein schien, und entschied mich, sie zuerst aufzuteilen (genau wie ich oben dachte, "Mitarbeiter"). , 'Gast', 'Zeitplan', 'Eigentümer'). Fügen Sie sie vor dem Vergessen zu INSTALLED_APPS in settings.py hinzu und schreiben Sie models.py.

Beginnen wir mit dem Personal.

staff/models.py

from django.db import models
from django.contrib.auth.models import User
from owner.models import GroupSchedule


class Staff(models.Model):
	groupschedule = models.ForeignKey(GroupSchedule)

	name = models.CharField(max_length=40)

	user = models.OneToOneField(User,null=True,blank=True)

	class Meta:
		unique_together = ( ('name','groupschedule',), )

	def __unicode__(self):
		return self.name

Derzeit ist Staff die einzige Modellklasse. 1.groupschedule: Um zu entscheiden, zu welcher Schichttabelle die Mitarbeiter gehören (damit die Mitarbeiter mehrerer Schichttabellen nicht verwechselt werden), wird sie mit einem Modell namens Gruppenzeitplan der Eigentümer-App verknüpft. Ich werde später über den Inhalt sprechen. 2.name: Wie Sie sehen können, ist es der Name des Personals. 3.user: Unter der Annahme, dass die Mitarbeiter ein Konto erstellen und sich anmelden und durchsuchen, ist es möglich, es der integrierten Modellklasse Benutzer (einschließlich Name, Kennwort usw.) zuzuordnen. Einige Leute berühren den Computer bei der Arbeit jedoch nicht, so dass ich ihn nicht zu einem erforderlichen Element gemacht habe (möglicherweise leer = Wahr ist nicht erforderlich? Ich verstehe die Unterscheidung zwischen null und leer hier nicht ...). 4.Meta: Sie können hier so etwas wie erweiterte Einstellungen hinzufügen. unique_together legt eine Kombination von Tabellen fest, die Sie nicht duplizieren möchten (anscheinend können Sie mehrere Kombinationen haben).

Als nächstes ist Gast.

guest/models.py

from django.db import models
from owner.models import GroupSchedule


class Guest(models.Model):
	groupschedule = models.ForeignKey(GroupSchedule)

	name = models.CharField(max_length=40)

	class Meta:
		unique_together = ( ('name','groupschedule',), )

	def __unicode__(self):
		return self.name

Es ist fast das gleiche wie beim Personal. Diese können jedes Mal aufgerufen werden, wenn Sie Ihrem Projekt eine weitere funktionierende App hinzufügen möchten.

** Die Tabelle, die für die Schichtproduktionsseite eindeutig zu sein scheint, ist im Modell der Zeitplan-App definiert (daher ist sie vorerst überwiegend hier). ** **.

schedule/models.py

from django.db import models
from django.core.validators import MaxValueValidator,MinValueValidator
from owner.models import GroupSchedule
from staff.models import Staff
from guest.models import Guest


#### base classes ####

class Date(models.Model):

	date = models.DateField()

	def strfdate(self):
		return self.date.strftime('%Y/%m/%d,%a')

	class Meta:
		abstract = True	# This class is not make table


class TimeTable(models.Model):
	start = models.TimeField(default='00:00')
	end = models.TimeField(default='00:00')

	def strftimetable(self):
		timef = '%H:%M'
		start,end = self.start,self.end
		return "%s ~ %s" % ( start.strftime(timef),end.strftime(timef) )

	class Meta:
		abstract = True	# This class is not make table


#### main classes ####

###### staff ######
class MonthShift(models.Model):
	year = models.PositiveIntegerField(validators=[MinValueValidator(1),])

	month = models.PositiveIntegerField(validators=[MaxValueValidator(12),MinValueValidator(1),])

	groupschedule = models.ForeignKey(GroupSchedule)

	completed = models.BooleanField(default=False)

	class Meta:
		unique_together = ( ('year','month','groupschedule',), )


class WorkTime(TimeTable):
	groupschedule = models.ForeignKey(GroupSchedule)

	title = models.CharField(max_length=50,unique=True)

	simbol = models.CharField(max_length=5,unique=True)

	def save(self,*args,**kwargs):
		from datetime import time
		if self.start >= self.end:
			WorkTime.objects.create(title=self.title+'2',simbol='-',start=time(0,0),end=self.end)

			self.end = time(23,59)
		super(WorkTime,self).save(*args,**kwargs)

	class Meta:
		unique_together = ( ('groupschedule','title',),('groupschedule','simbol',), )

	def __unicode__(self):
		return self.title


class StaffSchedule(Date):
	staff = models.ForeignKey(Staff,unique_for_date='date')

	worktime = models.ForeignKey(WorkTime)

	leader = models.BooleanField(default=False)

	phoner = models.BooleanField(default=False)

	def __unicode__(self):
		return self.strfdate()


class NgShift(Date):
	staff = models.ForeignKey(Staff,unique_for_date='date')

	ng_shift = models.ManyToManyField(WorkTime)

	def ng_values(self):
		values = self.ng_shift.values_list('title')
		
		return ",".join( reduce( lambda x,y:x + y ,values ) )
	
	def __unicode__(self):
		return self.staff.name


###### guest ######
class GuestSchedule(Date,TimeTable):
	guest = models.ForeignKey(Guest,unique_for_date='date')

	def __unicode__(self):
		return self.strfdate()

'Basisklassen' sind die übergeordneten Klassen, ** syncdb erstellt keine Tabelle **. 'Hauptklassen' sind die Klassen, die die Tabelle tatsächlich erstellen.

1.MonthShift: Definieren Sie, welche Gruppe, welches Jahr und welcher Monat der Schicht und ob sie vollständig ist (wenn Sie beispielsweise auf der Schichtbearbeitungsseite auf die Schaltfläche "Fertig stellen" klicken, werden alle leeren Arbeitsstunden in Feiertage umgewandelt. Ich möchte es so machen). Sowohl für das Jahr als auch für den Monat werden die Maximal- und Minimalwerte mit Validatoren festgelegt. 2.WorkTime: Definieren Sie Arbeitszeitmuster wie "Frühschicht" und "Spätschicht". An meinem Arbeitsplatz werden sie durch einen einzelnen Buchstaben wie "○" oder "△" dargestellt, daher habe ich auch einen Artikel namens "simbol". Durch Überschreiben der in django integrierten Methode save () haben wir einen Prozess hinzugefügt, um die Arbeitsstunden in tägliche Einheiten zu unterteilen, wenn die Arbeitszeit zwei Tage umfasst (ich möchte "★" für die Nachtschicht und "-" für die Morgendämmerung ausdrücken. Also werde ich es als ein anderes Muster registrieren). 3.StaffSchedule: Bedeutet Personaltermine nach Datum. Normalerweise fassen wir dies bei der Verteilung von Schichten monatlich zusammen. Erlauben Sie ForeignKey, nur eine WorkTime-Daten auszuwählen. Ich habe es gemacht, weil der Punkt, ob es sich um eine Tag- oder eine Nachtschicht handelt, auch in der aktuellen Tabelle enthalten war. 4.NgShift: Sie können in ManyToManyField mehrere WorkTime-Daten auswählen. Sie können sich registrieren, wenn das Personal sagt "Diese Zeit ist an diesem Tag nicht möglich" (alle Auswahlen sind echte Urlaubswünsche). ng_values ist eine handgemachte Funktion, die registrierte ng_shifts als durch Kommas getrennte Zeichenfolgen zurückgibt. Dies gilt jedoch für Administrationsseiten. 5.GuestSchedule: Es ähnelt StaffSchedule, aber die Nutzungsdauer der Kunden unterscheidet sich von der Arbeitszeit und es scheint schwierig, sie zu strukturieren. Daher handelt es sich um ein manuelles Eingabeformat.

Schließlich werden die Informationen für den Administrator im Eigentümer zusammengefasst.

owner/models.py

from django.db import models
from django.contrib.auth.models import User,Group
from django.core.validators import MaxValueValidator,MinValueValidator


class GroupSchedule(models.Model):
	group = models.OneToOneField(Group)

	owner = models.OneToOneField(User)

	start_point = models.PositiveIntegerField(default=1,validators=[MaxValueValidator(31),MinValueValidator(1),])

	def get_calendar(self,year,month):
		from calendar import Calendar

		from datetime import date
		cal_start = date( year,month,self.start_point )
		cal_end = cal_start.replace(month=cal_start.month+1)
		
		this_month = list( Calendar().itermonthdates( year,month ) )
		next_month = list( Calendar().itermonthdates( year,month+1 ) )
		
		wcal = this_month + next_month
		wcal_list = wcal[wcal.index(cal_start):wcal.index(cal_end)]

		return sorted( set(wcal_list),key=wcal_list.index )

	def __unicode__(self):
		return self.group.name

1.GroupSchedule: Sie können entscheiden, für welche Gruppe es geplant ist, wer der Eigentümer ist, und an start_point registrieren, an welchem Tag des Monats Sie beginnen (an Ihrem Arbeitsplatz hat sich der Wert vom 15. eines jeden Monats auf einen Monat geringfügig geändert, sodass Sie ihn frei festlegen können. Ich habe es in eine Form gebracht, die ich machen kann. get_calendar ist eine Funktion, die eine Reihe von Daten für einen Monat ab dem Startpunkt zurückgibt, aber Sie werden sie wahrscheinlich in der Ansicht aufrufen.

Ich denke, Sie haben eine Basisdatenbank erstellt.

Versuchen wir das nächste Mal "Experimentieren auf der Administrationsseite".

Recommended Posts

Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Entwurf des Datenbankmodells)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Einführung)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Authentifizierungsverarbeitung)
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Experiment auf der Admin-Seite)
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Erstellen Sie eine einfache Web-App mit Flasche
Todo-App mit Django erstellen ④ Ordner- und Aufgabenerstellungsfunktion implementieren
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
Erstellen Sie eine Webanwendung mit Django
Erstellen Sie mit Django einen Datei-Uploader
Erstellen Sie eine Web-App, die mit Plotly Dash einfach visualisiert werden kann
Eine Reihe von Amateur-Infrastrukturingenieuren, die Django mit Docker berühren (2): Erstellen eines Modells
"Klassifizierung von Müll nach Bild!" App-Erstellungstagebuch Tag3 ~ Webanwendung mit Django ~
Entwicklung einer WEB-Anwendung mit Django [Modelldefinition]
Spielen Sie wie eine Web-App mit ipywidgets
Erstellen Sie ein Modell für Ihren Django-Zeitplan
Erstellen Sie eine GUI-App mit Tkinter of Python
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
Erstellen der ersten App mit Django Startprojekt
Erstellen Sie einen Webdienst mit Docker + Flask
Ich habe eine WEB-Bewerbung bei Django gemacht
Die Geschichte der Erstellung einer Webanwendung, die umfangreiche Lesungen mit Django aufzeichnet
Versuchen Sie, eine Webanwendung mit Vue.js und Django (Mac Edition) zu erstellen - (1) Umgebungskonstruktion, Anwendungserstellung
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Django Tutorial (Blog App erstellen) ① - Vorbereitung, Erstellung der obersten Seite
So entwickeln Sie eine Cart-App mit Django
Entwicklung einer WEB-Anwendung mit Django [Erstellung des Admin-Bildschirms]
Erstellen Sie eine PDF-Datei mit einer zufälligen Seitengröße
Erstellen Sie eine Seite, die unbegrenzt mit Python geladen wird
[Python] Erstellen Sie mit Docker eine Django-Entwicklungsumgebung
Erstellen Sie mit der Doker Toolbox eine Django-Entwicklungsumgebung
Erstellen Sie eine neue Seite im Zusammenfluss mit Python
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Bis Sie eine neue App in Django erstellen
Extrahieren Sie mit Python Daten von einer Webseite
Erstellen Sie eine Tabelle mit IPython Notebook
Erstellen Sie eine Webseite, auf der ein Modell ausgeführt wird, das die Auflösung des Bilds mithilfe von Gradio erhöht, wodurch das Erstellen eines Webbildschirms vereinfacht wird