【问题标题】:How to get all related objects from a reverse foreign key Django serializer (one-to-many)?如何从反向外键 Django 序列化程序(一对多)中获取所有相关对象?
【发布时间】:2019-09-13 20:45:05
【问题描述】:

我一直在尝试创建一个类似 Trello 的克隆并将我的“列表”和“应用程序”存储为单独的模型,并在我的“应用程序”模型上使用外键创建列表和应用程序之间的一对多。我通常使用 Node 和 Sequelize 并且尝试查询我的列表并返回所有具有列表 ID 作为应用程序外键的应用程序都失败了。我怀疑我只是在我的序列化器上遗漏了一些愚蠢的东西。

我尝试了一些破坏代码的方法,但现在我只是让它返回 List 的字段,如下所示:

[
    {
        "title": "My First List"
    }, 
    {
        "title": "My Second List"
    }, 
] 

实际上,我真正想要的是:

[
    {       "id": 1,
            "title": "My First List",
                "applications": [
                        {
                            "id": 1,
                            "company_name": "Spotify",
                            "position": "Web Engineer",
                            "date_applied": "2019-09-09",
                            "application_id": "xv112_cv",
                            "priority_level": "High",
                            "company_contact_email": "jg@spotify.com",
                            "notes": "Seems promising",
                            "location": "New York",
                            "status_list": "1"
                    },
                    {
                            "id": "2",
                            "company_name": "Foursquare",
                            "position": "Client Solutions Engineer",
                            "date_applied": "2019-10-09",
                            "application_id": "fsq_app_1",
                            "priority_level": "High",
                            "company_contact_email": "jdwyer@foursquare.com",
                            "notes": "Interview on 9/29/19",
                            "location": "New York",
                            "status_list": "1"
                    },
                ]
            }, 
            {
                "id": "2"
                "title": "My Second List",
                "applications": "applications": [
                    {
                        "id": "3",
                        "company_name": "Etsy",
                        "position": "Web Engineer",
                        "date_applied": "2019-09-09",
                        "application_id": "12345",
                        "priority_level": "High",
                        "company_contact_email": "",
                        "notes": "Seems promising",
                        "location": "New York",
                        "status_list": 2
                }
            ] 
        }
]

这是我的模型:

class List(models.Model):
    title = models.CharField(max_length=100)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)


class Application(models.Model):
    _list = models.ForeignKey(
        List, related_name='list', on_delete=models.CASCADE, null=True
    )
    company_name = models.CharField(max_length=100)
    position = models.CharField(max_length=100)
    date_applied = models.DateField(
        default=date.today(), blank=True)
    application_id = models.CharField(blank=True, max_length=100)
    [ . . . ]

我的序列化器在这里:

class ListSerializer(serializers.ModelSerializer):

    applications_set = ApplicationSerializer(read_only=True, many=True)

    class Meta:
        model = List
        fields = ('title', 'applications_set',)
        depth = 1


class ApplicationSerializer(serializers.ModelSerializer):

    class Meta:
        model = Application
        fields = '__all__'

我知道我的 List 模型上没有“applications”或“applications_set”字段,但由于定义了 fkey 关联,我认为这不是必需的。

我正在尝试做的事情可能吗?我错过了什么?

我的视图集也供参考:

class AllListsViewSet(viewsets.ModelViewSet):
    queryset = List.objects.all()

    permission_classes = [permissions.AllowAny]

    serializer_class = ListSerializer

class ApplicationViewSet(viewsets.ModelViewSet):

    queryset = Application.objects.all()

    permission_classes = [
        permissions.AllowAny
    ]
    serializer_class = ApplicationSerializer

编辑: 想通了——在我的应用程序模型上,我只是对相关名称属性做了一个小调整:

status_list = models.ForeignKey(
        List, related_name='applications', on_delete=models.CASCADE, null=True
    )

在我的 ListSerializer 上:

class ListSerializer(serializers.ModelSerializer):

    applications = ApplicationSerializer(read_only=True, many=True)

    class Meta:
        model = List
        fields = ('title', 'applications',)

【问题讨论】:

    标签: django django-models django-rest-framework one-to-many django-serializer


    【解决方案1】:

    您已为 FK 指定了一个 related_name。这会覆盖application_set。您已将其命名为 list,这根本不是一个好名字,但既然您已经设置了它,那么您需要在序列化程序中将其用作字段名称。

    我建议删除 related_name 属性 - 并重命名 FK 本身,字段名称中不应包含下划线前缀。

    【讨论】:

    • 感谢您的建议,我已在 Applications 模型中将 list 重命名为 status_list 并删除了 related_name 属性。我已经在我的列表序列化程序中反映了这一点,但仍然没有返回任何内容,但在运行迁移后没有嵌套应用程序的列表信息。还有其他建议吗? **也不知道这是否重要,但列表和应用程序模型、序列化程序和视图集都在项目中它们自己的应用程序中,而不是在同一个应用程序中。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2018-02-14
    • 1970-01-01
    • 2011-06-16
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多