小编hnr*_*oot的帖子

Django Rest Framework Serializer关系:如何获取父级序列化器中所有子对象的列表?

我是DRF的新手,刚刚开始构建API.我有两个模型,一个子模型连接到具有外键的父模型.这是我所拥有的模型的简化版本:

class Parent(models.Model):
    name = models.CharField(max_length=50)


class Child(models.Model):
    parent = models.ForeignKey(Parent)
    child_name = models.CharField(max_length=80)
Run Code Online (Sandbox Code Playgroud)

为了创建序列化器,我遵循了DRF Serializer Relations,我创建了如下:

class ChildSerializer(serializers.HyperlinkedModelSerializer):

    parent_id = serializers.PrimaryKeyRelatedField(queryset=Parent.objects.all(),source='parent.id')

    class Meta:
        model = Child
        fields = ('url','id','child_name','parent_id')

    def create(self, validated_data):
        subject = Child.objects.create(parent=validated_data['parent']['id'], child_name=validated_data['child_name'])

        return child


class ParentSerializer(serializers.HyperlinkedModelSerializer):
    children = ChildSerializer(many=True, read_only=True)
    class Meta:
        model = Course
        fields = ('url','id','name','children')
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取父级序列化程序中所有子项的列表.我想要的是能够得到这样的回应:

{
    'url': 'https://dummyapidomain.com/parents/1/',  
    'id': '1',
    'name': 'Dummy Parent Name',
    'cildren': [
        {'id': 1, 'child_name': 'Dummy Children I'},
        {'id': 2, 'child_name': 'Dummy Children II'},
        {'id': …
Run Code Online (Sandbox Code Playgroud)

python django serialization django-rest-framework

18
推荐指数
2
解决办法
1万
查看次数

Django测试:TransactionManagementError:在"原子"块结束之前,您无法执行查询

Django新手在这里.我正在尝试为我开发的简单API实现单元测试.下面你可以找到我的测试实现工作正常:

from django.test import TestCase
from my_app.models import MyModel


class TestMyViewSet(TestCase):
    """
    Unit tests for endpoints in MyViewSet.
    """
    fixtures = ['my_app/fixtures/data.yaml']

    def setUp(self):
        # Making setup for the test case here.


    def test_post_my_resource(self):

        # Checking that fixture is loaded correctly.
        self.assertEqual(MyModel.objects.all().count(),1)

        request_body = {
            'my_resource': "input_for_my_resource"
        }

        response = self.client.post('/my_resources/', data=request_body)
        self.assertEqual(response.status_code, 201)
        # self.assertEqual(MyModel.objects.all().count(),2)
Run Code Online (Sandbox Code Playgroud)

但是,当我通过检查实例数量self.assertEqual(MyModel.objects.all().count(),2)从注释中删除最后一行以测试my_resource在相应模型上成功创建时,我收到一条错误,说明以下内容:

TransactionManagementError:当前事务中发生错误.在"原子"块结束之前,您无法执行查询.

我在这里错过了什么?

提前致谢!

PS:我遇到了以下问题:TransactionManagementError"在使用信号时你不能在'原子'块结束之前执行查询",但仅在单元测试期间但我不确定在我的情况下发生的情况是相同的.

python django unit-testing

8
推荐指数
1
解决办法
4438
查看次数

Django Rest Framework:如何初始化和使用自定义异常处理程序?

DRF新手在这里。

我正在尝试通过自定义异常处理程序处理项目中的所有异常。基本上,我想要做的是如果任何序列化程序无法验证数据,我想将相应的错误消息发送到我的自定义异常处理程序并相应地重新格式化错误。

我已将以下内容添加到settings.py 中。

# DECLARATIONS FOR REST FRAMEWORK
REST_FRAMEWORK = {
    'PAGE_SIZE': 20,
    'EXCEPTION_HANDLER': 'main.exceptions.base_exception_handler',

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication'
    )
}
Run Code Online (Sandbox Code Playgroud)

但是一旦我向项目中的任何端点发送了无效参数,我仍然会收到 DRF 验证器的默认错误消息。(例如 {u'email': [u'This field is required.']})

在相应序列化程序的验证函数上引发的错误永远不会到达我的异常处理程序。

这是我正在处理的项目树的图像。

我错过了什么吗?

先感谢您。

python django exception-handling django-rest-framework

6
推荐指数
1
解决办法
4218
查看次数

无法连接到 AWS EC2 实例中的 Docker PostgreSQL 容器

Docker 新手在这里。

我正在尝试在 AWS EC2 实例中为 PostgreSQL 创建一个 docker 容器。

首先,为了实现持久性,我使用了数据卷容器。这是我用来为我的 PostgreSQL 数据库创建数据卷容器的命令:

docker create -v /var/lib/postgresql/data --name postgres9.3.6-data busybox
Run Code Online (Sandbox Code Playgroud)

然后我运行以下命令来创建 PostgreSQL 容器:

docker run --name postgres9.3.6 \
-p 5432:5432 \
-e POSTGRES_PASSWORD=password \
-e POSTGRES_USER=root \
-e POSTGRES_DB=db_name \
-d --volumes-from postgres9.3.6-data postgres:9.3.6
Run Code Online (Sandbox Code Playgroud)

我在我的本地环境中运行它,然后尝试通过 PostgreSQL 桌面客户端连接到它并且它工作正常。我能够连接到存储在本地 PostgreSQL docker 容器中的 db_name。

在此之后,我进入 AWS 中的一个 EC2 实例。并遵循我上面描述的相同流程。然后返回到 PostgreSQL 桌面客户端并尝试连接到它。但我收到以下错误消息:

拒绝连接。检查主机名和端口是否正确以及 postmaster 是否正在接受 TCP/IP 连接。

我在这里缺少什么?

编辑

我已经检查并将 postgresql.conf 文件上的 listen_addresses 设置为

listen_addresses='*'
Run Code Online (Sandbox Code Playgroud)

并将以下行附加到 pg_hba.conf 文件:

host all all 0.0.0.0/0 …
Run Code Online (Sandbox Code Playgroud)

postgresql amazon-ec2 amazon-web-services docker

6
推荐指数
1
解决办法
2259
查看次数

Django Rest Framework:如何在GET请求的响应中添加自定义字段?

我是DRF的新手,刚刚开始构建API.

我有一个名为Shop的模特.我有两个用户不同的用户类型:客户供应商.

  1. 我想在GET请求/商店/ id /的响应中添加自定义字段距离,该距离表示提交请求的客户与相应商店之间的距离.
  2. 我想我不能使用SerializerMethodField,因为该方法的值不仅取决于对象本身.
  3. 我不想为所有GET请求添加此自定义字段,而是在提交请求的用户是Customer时我需要添加它.

考虑到上述约束,我应该如何将自定义字段添加到请求的响应中?最好的方法是什么?

python django django-rest-framework

5
推荐指数
1
解决办法
1305
查看次数