I am building an api for entertainment management.
The user can create empty project or projects with show, tour and festival. User can also create show and specify project id.
A project can contain:
- Show 0 to *
- Tour 0 to *
- Festival 0 to *
A Tour can contain:
- Show 0 to 1
A Festival can contain:
- Show 0 to *
A Show, Tour and Festival necessarily part of a Project.
Here are my models:
class Project(models.Model):
"""Models for Projects"""
name = models.CharField(max_length=255, unique=True)
shows = models.ManyToManyField('Show', blank=True)
festivals = models.ManyToManyField('Festival', blank=True)
tours = models.ManyToManyField('Tour', blank=True)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
date_created = models.DateTimeField(auto_now_add=True)
last_update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Show(models.Model):
"""Models for Shows"""
name = models.CharField(max_length=255, unique=True)
start_date = models.DateTimeField(default=timezone.now, blank=True)
end_date = models.DateTimeField(default=timezone.now, blank=True)
tours = models.ManyToManyField('Tour', blank=True)
festivals = models.ManyToManyField('Festival', blank=True)
projects = models.ForeignKey(Project, on_delete=models.CASCADE, default=None)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
date_created = models.DateTimeField(auto_now_add=True)
last_update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Tour(models.Model):
"""Models for Tour."""
name = models.CharField(max_length=255, unique=True)
start_date = models.DateTimeField(default=timezone.now, blank=True)
end_date = models.DateTimeField(default=timezone.now, blank=True)
production = models.CharField(max_length=255, blank=True)
shows = models.ForeignKey(Show, on_delete=models.CASCADE, blank=True, null=True)
projects = models.ForeignKey(Project, on_delete=models.CASCADE, default=None)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
date_created = models.DateTimeField(auto_now_add=True)
last_update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class Festival(models.Model):
"""Models for Festival."""
name = models.CharField(max_length=255, unique=True)
start_date = models.DateTimeField(default=timezone.now, blank=True)
end_date = models.DateTimeField(default=timezone.now, blank=True)
address_1 = models.CharField(max_length=128, blank=True)
address_2 = models.CharField(max_length=128, blank=True)
city = models.CharField(max_length=64, default="Paris")
state = models.CharField(max_length=25, default='France')
zip_code = models.CharField(max_length=8, default="92000")
gps = models.CharField(max_length=255, blank=True)
technical_rider = models.FileField(null=True, upload_to=riders_file_path)
shows = models.ForeignKey(Show, on_delete=models.CASCADE, blank=True, null=True)
projects = models.ForeignKey(Project, on_delete=models.CASCADE, default=None)
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
date_created = models.DateTimeField(auto_now_add=True)
last_update = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
everything works fine but I have a doubt about the double relationship m2m / foreignkey between :
class Project(models.Model):
"""Models for Projects"""
shows = models.ManyToManyField('Show', blank=True)
AND
class Show(models.Model):
"""Models for Shows"""
projects = models.ForeignKey(Project, on_delete=models.CASCADE, default=None)