Django - Сохранить объект с несколькими моделями в БД - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь сделать приложение для парковки.Что мне нужно, это сохранить несколько экземпляров одного и того же объекта в БД.По сути, если пользователь выбирает, что он хочет парковать с 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 голосов
/ 23 сентября 2018

Внутри модели 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...