Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django多对多字段结构所需的建议_Django_Python 3.x_Postgresql_Django Models - Fatal编程技术网

Django多对多字段结构所需的建议

Django多对多字段结构所需的建议,django,python-3.x,postgresql,django-models,Django,Python 3.x,Postgresql,Django Models,我正在构建一个REST-API,它将被一个Angular应用程序使用——这是我的吉他公司的网站。有一个艺术家个人资料页面,显示艺术家的姓名、简短的个人简历、与他们相关的项目(乐队)列表以及他们活动的日期范围。这就是事情变得复杂的地方 任何给定的项目都可以与不止一个艺术家联系在一起,也就是说,我可以有两个来自同一个乐队的吉他手。我通过创建一个多对多的领域来解决这种关联,它非常有效……直到我意识到我有很多艺术家在不同的时间在同一个乐队工作 到目前为止,我已经尝试了很多方法。我希望我能把它们列出来,但

我正在构建一个REST-API,它将被一个Angular应用程序使用——这是我的吉他公司的网站。有一个艺术家个人资料页面,显示艺术家的姓名、简短的个人简历、与他们相关的项目(乐队)列表以及他们活动的日期范围。这就是事情变得复杂的地方

任何给定的项目都可以与不止一个艺术家联系在一起,也就是说,我可以有两个来自同一个乐队的吉他手。我通过创建一个多对多的领域来解决这种关联,它非常有效……直到我意识到我有很多艺术家在不同的时间在同一个乐队工作

到目前为止,我已经尝试了很多方法。我希望我能把它们列出来,但我有点迷路了。但是,下面的代码是我现在所在的位置。我确实可以将一个乐队与多个艺术家联系起来,但我不能将不同的日期范围与同一乐队中的不同艺术家联系起来。非常感谢您的指导

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
中的外键,以便
artistProjects
可以有多个
projectDate
但反之亦然:

class projectDate(models.Model):
    begin = models.DateField()
    end = models.DateField()
    project = models.ForeignKey(artistProjects, related_name='dates')

请注意,您的
artistProjects
仅代表一个项目,因此应避免使用复数名称。将其命名为artistProject将使您的代码更具可读性。

不确定我是否能解决您的问题。我将用一种简单的方式来描述它,这样你们就可以用你们的模型来调整它。 这是我的建议。希望它能解决你的问题

Artist Profile
id (PK)
artist_name
artist_image
description
band_website

Artist Social Media
id (PK)
artist_profile_id (FK)(Artist Profile)
facebook
twitter
instagram

Artist Project
id (PK)
artist_band_project_id (FK)(Artis Band Project) 

Artist Band Project
id (PK)
begin
end

Artist Band Project Member
id (PK)
artis_band_project_id (FK)(Artist Band Project)
artis_profile_id (FK)(Artist Profile)
问候,


Meikelwis Wijaya

@blhsing最终成为了所有答案中最接近的一个,但要获得我所寻找的关系和JSON结构,需要更多的信息

以下是这些模型的工作原理: 从django.db导入模型

class artistProfile(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 artistProject(models.Model):
    project_name = models.CharField(max_length=20)


    def __str__(self):
        return self.project_name


class projectTenure(models.Model):
    begin = models.DateField()
    # blank and null are allowed here in case an artists is still with a given project
    end = models.DateField(blank=True, null=True)

    project = models.ForeignKey(artistProject, on_delete=models.CASCADE)
    artist = models.ForeignKey(artistProfile, on_delete=models.CASCADE,
                               related_name='projects')

    def __str__(self):
        #   TODO: find a way to return the related project and artist names
        string_date_range = self.begin.strftime("%d/%m/%y") + "-"
        return string_date_range


class artistSocialMedia(models.Model):
    facebook = models.URLField()
    twitter = models.URLField()
    instagram = models.URLField()
    artist = models.ForeignKey(artistProfile, related_name='social_media',
                               on_delete=models.CASCADE)

    def __str__(self):
        return self.artist.artist_name
下面是我如何序列化它的:

from rest_framework import serializers
from .models import (artistProfile, artistProject, projectTenure, artistSocialMedia)


class artistSocialMediaSerializer(serializers.ModelSerializer):
    class Meta:
        model = artistSocialMedia
        fields = ('facebook', 'twitter', 'instagram')


class artistProjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = artistProject
        fields = ('project_name',)


class projectTenureSerializer(serializers.ModelSerializer):
    project_name = serializers.CharField(source='project.project_name')

    class Meta:
        model = projectTenure
        fields = ('project_name', 'begin', 'end')


class artistProfileSerializer(serializers.ModelSerializer):
    projects = projectTenureSerializer(many=True, read_only=True)
    social_media = artistSocialMediaSerializer(many=True, read_only=True)

    class Meta:
        model = artistProfile
        fields = ('artist_name', 'artist_image', 'description',
                  'band_website', 'projects', 'social_media')

这似乎非常接近我所需要的,尽管我确实需要向
projectDate
添加一个外键,该外键与
artistProfile
模型相关,以使它以我期望/需要的方式显示在Django管理中。现在我需要序列化它并测试它,看看它是否以我想要的格式返回一个JSON对象,只要每个艺术家能够在同一个频带中有不同的活动日期,就可以使用正确的行为。我将在周一汇报。另外,你是对的,我在将模型命名为复数时使用了错误的命名约定。我知道的更多,所以谁知道我为什么这么做。但是,我最终确实纠正了这个…好的地方。这需要比我预期的更多的重组,但你的答案最终确实引导我走上了正确的道路,如果你想看一看的话,我发布了最终起作用的答案。多谢!!看起来您建议使用一个联接表,或者至少是一个类似Django的版本。这可能需要一些调整,但我认为可能有点冗长。我最初的设置,以及@blhsing的方法,在三种模型中产生了相同的效果:
artistProfile
artistProject
projectDate
。谢谢@Meikelwis-Wijaya,我终于找到了一种方法让它工作了!