我正在构建一个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

最佳答案

artistProjectsprojectDate不应该是多对多的关系,因为projectDate是项目特有的,不太可能被许多人共享。相反,您可以将artistProjects设为projectDate中的外键,以便aartistProjects可以有许多projectDates,但反之亦然:

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/

10-12 20:11