我正在构建一个REST-API,它将被一个角度应用程序使用-这是为我的吉他公司的网站。有一个“艺术家配置文件”页,其中显示了艺术家的姓名、简短的个人简介和与之关联的项目(乐队)列表以及与之一起活动的日期范围。这就是事情变得复杂的地方。
任何给定的项目都可以与一个以上的艺术家相关联,也就是说,我可以有两个来自同一乐队的吉他手。我能够通过创建一个多对多的领域来解决这种关联,并且它工作得很好……直到我意识到我有在不同时期在同一个乐队的艺术家。
到目前为止,我已经尝试了很多方法。我希望我能把它们列出来,但我有点迷路了。但是,下面的代码是我现在所在的位置。我确实可以将一个乐队与多个艺术家相关联,但不能将不同的日期范围与同一乐队中的不同艺术家相关联。任何指导都是非常感谢的。
class projectDate(models.Model):
begin = models.DateField()
end = models.DateField()
def __str__(self):
string_date_range = self.begin.strftime("%d/%m/%y") + "-" + self.end.strftime("%d/%m/%y")
return string_date_range
class artistProfiles(models.Model):
artist_name = models.CharField(max_length=20)
artist_image = models.URLField()
description = models.TextField(max_length=500)
band_website = models.URLField()
def __str__(self):
return self.artist_name
class artistProjects(models.Model):
project_name = models.CharField(max_length=20)
dates = models.ManyToManyField(projectDate, related_name='date_span')
artists = models.ManyToManyField(artistProfiles, related_name='projects')
def __str__(self):
return self.project_name
class artistSocialMedia(models.Model):
facebook = models.URLField()
twitter = models.URLField()
instagram = models.URLField()
artist = models.ForeignKey(artistProfiles, related_name='social_media', on_delete=models.CASCADE)
def __str__(self):
return self.artist.artist_name
最佳答案
artistProjects
和projectDate
不应该是多对多的关系,因为projectDate
是项目特有的,不太可能被许多人共享。相反,您可以将artistProjects
设为projectDate
中的外键,以便aartistProjects
可以有许多projectDate
s,但反之亦然:
class projectDate(models.Model):
begin = models.DateField()
end = models.DateField()
project = models.ForeignKey(artistProjects, related_name='dates')
注意,您的
artistProjects
只代表一个项目,因此您应该避免给它取复数名称。将其命名为artistProject
将使您的代码更具可读性。关于django - Django中多对多字段的结构需要的建议,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52675119/