Django-将多个模型对象保存到数据库

时间:2018-09-22 20:13:17

标签: python django django-models multiple-models

我正在尝试制作停车应用程序。我需要在数据库中保存同一对象的多个实例。基本上,如果用户选择从2018-09-23(parking_on)到2018-09-28(parking_off)停车,则我需要将同一模型保存5次,并保留所有必需的详细信息。 enter image description here

这些是我的模特:

from django.db import models
from django.urls import reverse
from django.db.models.signals import pre_save
from django.utils.text import slugify
from django.conf import settings
from django.utils import timezone
# from datetime import datetime
from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from datetime import datetime, timedelta, time
today = datetime.now().date()
tomorrow = today + timedelta(1)
now = datetime.now()
l = now.hour
m=int(now.strftime("%H"))

class ParcareManager(models.Manager):

    def active(self, *args, **kwargs):
        return super(ParcareManager, self).filter(draft=False).filter(parking_on__lte=timezone.now())


class Parcare(models.Model):
    PARKING_PLOT = (
        ('P1', 'Parking #1'), ('P2', 'Parking #2'),('P3', 'Parking #3'))
    user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, 
                            null=True, default=1, on_delete=True)
    email=models.EmailField(blank=True, null=True)
    parking_on = models.DateField(auto_now=False, auto_now_add=False,
                                  blank=True, null=True,
                                  help_text='Alege data cand doresti sa vii in office')
    parking_off = models.DateField(
        auto_now=False, auto_now_add=False, blank=True, null=True, help_text='Alege Data Plecarii')  
    numar_masina = models.CharField(max_length=8, default="IF77WXV", 
    blank=True, null=True, help_text='Introdu Numarul Masinii')
    location = models.CharField(max_length=3, blank=True, default="P1",
                                null=True, choices=PARKING_PLOT,
                                help_text='Alege Locul de Parcare Dorit')
    updated = models.DateTimeField(auto_now=True, auto_now_add=False,blank=True, null=True)
    timestamp=models.DateTimeField(auto_now=False, auto_now_add=True,blank=True, null=True)
    venire = models.TimeField(default=time(9, 00), auto_now=False,
     auto_now_add=False, help_text='Alege Ora Venirii')
    plecare = models.TimeField(default=time(
        18, 00), auto_now=False, auto_now_add=False, help_text='Alege Ora Plecarii')
    booked = models.BooleanField(default=1)
    objects = ParcareManager()

    def __str__(self):
        return self.location + " | " + str(self.parking_on) + " | " + str(self.parking_off)

    class Meta:
        verbose_name_plural = "parcare"
        ordering = ["-parking_on"]

    def clean(self):        
        q = Parcare.objects.filter(parking_on=self.parking_on)

        if self.location in q: #nu merge sa filtram si sa vedem daca locul a fost luat deja
            raise ValidationError(_('Sorry this plot is already taken!'))

        if self.parking_on == today:  # merge--vedem dak parcam azi si dak e tecut de ora 16
            raise ValidationError({'parking_on': _('Please book for a date starting tomorrow')})

        if self.parking_off < self.parking_on: #merge-vedem daca bookam in trecut
            raise ValidationError({'parking_off': _('You cant book for a past date!')})
        if m < 17: # se schimba semnul in > cand va fi in productie
            raise ValidationError({'parking_on':_('Sorry the booking session is closed!')})

        if self.parking_on != self.parking_off:
            delta= self.parking_off.day-self.parking_on.day
            print(delta)
            for i in range(delta):                
                self.user=self.user
                self.email=self.email
                self.parking_on=self.parking_on+timedelta(i)
                self.parking_off=self.parking_off
                self.numar_masina=self.numar_masina
                self.location=self.location
                self.venire="00:00:00"
                self.plecare = "00:00:00"
                self.booked=self.booked
                self.save

如果有人可以帮助我,我会欠你很多!

1 个答案:

答案 0 :(得分:1)

在模型Parcare中,定义一个函数 save(),如下所示:

    def save(self):
        list=[]
        d=self.parking_on
        while d<self.parking_off:
            list.append(
                Parcare(user=self.user,
                    email=self.email,
                    #remaing fields in the model
                    parking_on=d,
                    parking_off=d,
                    #remaing fields in the model    
                    )
                )
            d= d +timedelta(days=1)

        Parcare.objects.bulk_create(list)

您需要导入以下内容以运行上面的代码(您已经在代码中导入了它):

from datetime import timedelta