Create objects using a start date, an end date and time list

26 views
Skip to first unread message

Kakar Nyori

unread,
Feb 15, 2018, 12:58:50 PM2/15/18
to Django users
I have an Event model, and each event will have different shows.

    class Event(models.Model):
        title = models.CharField(max_length=200)

    class Show(models.Model):
        event = models.ForeignKey(Event, on_delete=models.CASCADE)
        date_time = models.DateTimeField(unique=True)

    class Ticket(models.Model):
        show = models.ForeignKey(Show)
        seat = models.ForeignKey(Seat)

        class Meta:
            unique_together = ('show', 'seat')

I need to create shows based on the start date and end date provide by the user. Suppose this is a JSON post:

    {
        "event_id": 1,
        "start_date": "2018-02-16",
        "end_date": "2018-02-20",
        "time_list": ["11:00 AM", "8:00 PM"]
    }

From the above JSON example, I need to create Show starting like this:

    # Start with the start_date as the date, and for each time from the time_list
    Show.objects.create(
        event = 1,
        date_time = datetime.strptime('2018-02-16 11:00 AM', "%Y-%m-%d %I:%M %p")
    )
    Show.objects.create(
        event = 1,
        date_time = datetime.strptime('2018-02-16 8:00 PM', "%Y-%m-%d %I:%M %p")
    )
    # Next date after the start_date, i.e., 16+1 = 17
    Show.objects.create(
        event = 1,
        date_time = datetime.strptime('2018-02-17 8:00 PM', "%Y-%m-%d %I:%M %p")
    )
    .
    .
    .
    # Create Show objects till the end_date and for each time from the time_list
    Show.objects.create(
        event = 1,
        date_time = datetime.strptime('2018-02-20 8:00 PM', "%Y-%m-%d %I:%M %p")
    )

Right now this is how I am creating Show objects:

    def create_show_by_datetime(self, request):
        event_id = request.data['event_id']
        start_date = request.data['start_date']
        end_date = request.data['end_date']
        time_list = request.data['time_list']

        format = '%Y-%m-%d'
        delta_days = datetime.strptime(end_date, format).date() - datetime.strptime(start_date, format).date()
        delta_days = delta_days.days + 1

        for i in range(delta_days):
            day = datetime.strptime(start_date, format) + timedelta(days=i)
            for i in range(len(time_list)):
                hrs = datetime.strptime(time_list[i], "%I:%M %p").hour
                mins = datetime.strptime(time_list[i], "%I:%M %p").minute
                event = Event.objects.get(id=event_id)
                dt = day + timedelta(hours=hrs, minutes=mins)
                show = Show.objects.create(
                    event=event,
                    date_time=dt
                )

But I am really hoping there's much more elegant way than how I am doing. I am using python 3, django 2 and django rest frameowork. Could you please help me?

Thank you
Reply all
Reply to author
Forward
0 new messages