我是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) 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"在使用信号时你不能在'原子'块结束之前执行查询",但仅在单元测试期间但我不确定在我的情况下发生的情况是相同的.
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.']})
在相应序列化程序的验证函数上引发的错误永远不会到达我的异常处理程序。
这是我正在处理的项目树的图像。
我错过了什么吗?
先感谢您。
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) 我是DRF的新手,刚刚开始构建API.
我有一个名为Shop的模特.我有两个用户不同的用户类型:客户和供应商.
考虑到上述约束,我应该如何将自定义字段添加到请求的响应中?最好的方法是什么?