Python 断言错误:400!=201在运行测试用例时

Python 断言错误:400!=201在运行测试用例时,python,python-3.x,django-rest-framework,foreign-keys,http-status-code-400,Python,Python 3.x,Django Rest Framework,Foreign Keys,Http Status Code 400,我是Django的新手。当我运行命令python manage.py test时,我不断收到以下错误 Tact/tact_api/lines/test_views.py", line 103, in test_api_can_create_an_event self.assertEqual(self.response.status_code, status.HTTP_201_CREATED) AssertionError: 400 != 201 -----------------------

我是Django的新手。当我运行命令python manage.py test时,我不断收到以下错误

Tact/tact_api/lines/test_views.py", line 103, in 
test_api_can_create_an_event
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
AssertionError: 400 != 201

----------------------------------------------------------------------
Ran 8 tests in 0.105s
class EventSerializer(serializers.HyperlinkedModelSerializer):
"""
Convert Event model instance into native Python datatypes to be rendered as JSON.
"""
owner = serializers.ReadOnlyField(source='owner.username')

class Meta:
    model = Event
    fields = ('url', 'id', 'owner', 'created', 'modified', 'title', 'desc', 'start',
              'end', 'line')

def get_fields(self, *args, **kwargs):
    """
    create and return a new Event object (linked to a user owned Line) with validated data.

    update and return an existing Event object with validated data.
    """
    fields = super(EventSerializer, self).get_fields(*args, **kwargs)
    view = self.context['view']
    owner = view.request.user
    fields['line'].queryset = fields['line'].queryset.filter(owner=owner)
    return fields
class EventSerializer(serializers.ModelSerializer) 
我真的非常感谢任何帮助解决这个问题!我自己的一些想法包括:

1) 我的事件对象post请求中可能存在语法错误。请参阅下面的测试代码。 2) 该问题可能与配置有关

参考请参见下面的测试

class EventViewTestCase(TestCase):
"""
Test suite for Event API views
"""
def setUp(self):
    """
    Define the event test client and other test variables.
    """
    user = User.objects.create(username="tactician")

    # initialize client and force authentication
    self.client = APIClient()
    self.client.force_authenticate(user=user)

    # create and post a new line using authorized user
    # since user model instance is not serializable, use its Id/PK
    self.line_data = {'owner': user.id, 'title': 'Title goes here'}
    self.res = self.client.post(reverse('line-list'), self.line_data, format='json')

    # create and post a new event linked to created line using authorized user
    line = Line.objects.get()
    self.event_data = {'owner': user.id, 'pk': line.id, 'title': 'Title goes here',
                       'desc': 'Desc. here', 'start': timezone.now(), 'end': timezone.now()}
    self.response = self.client.post(reverse('event-list'), self.event_data, format='json')

def test_api_can_create_an_event(self):
    """
    Test the api has event creation capability.
    """
    self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
序列化程序

Tact/tact_api/lines/test_views.py", line 103, in 
test_api_can_create_an_event
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
AssertionError: 400 != 201

----------------------------------------------------------------------
Ran 8 tests in 0.105s
class EventSerializer(serializers.HyperlinkedModelSerializer):
"""
Convert Event model instance into native Python datatypes to be rendered as JSON.
"""
owner = serializers.ReadOnlyField(source='owner.username')

class Meta:
    model = Event
    fields = ('url', 'id', 'owner', 'created', 'modified', 'title', 'desc', 'start',
              'end', 'line')

def get_fields(self, *args, **kwargs):
    """
    create and return a new Event object (linked to a user owned Line) with validated data.

    update and return an existing Event object with validated data.
    """
    fields = super(EventSerializer, self).get_fields(*args, **kwargs)
    view = self.context['view']
    owner = view.request.user
    fields['line'].queryset = fields['line'].queryset.filter(owner=owner)
    return fields
class EventSerializer(serializers.ModelSerializer) 

这个问题现在已经解决了

首先,在我的测试套件中,我提供给post请求的事件负载数据中有一个轻微的语法错误

self.event_data = {'owner': user.id, 'pk': line.id...}
改为是在我的事件模型中指定的外键字段名。)

其次,对于我的事件序列化程序,我使用了错误的基类

class EventSerializer(serializers.HyperlinkedModelSerializer)
改为

Tact/tact_api/lines/test_views.py", line 103, in 
test_api_can_create_an_event
self.assertEqual(self.response.status_code, status.HTTP_201_CREATED)
AssertionError: 400 != 201

----------------------------------------------------------------------
Ran 8 tests in 0.105s
class EventSerializer(serializers.HyperlinkedModelSerializer):
"""
Convert Event model instance into native Python datatypes to be rendered as JSON.
"""
owner = serializers.ReadOnlyField(source='owner.username')

class Meta:
    model = Event
    fields = ('url', 'id', 'owner', 'created', 'modified', 'title', 'desc', 'start',
              'end', 'line')

def get_fields(self, *args, **kwargs):
    """
    create and return a new Event object (linked to a user owned Line) with validated data.

    update and return an existing Event object with validated data.
    """
    fields = super(EventSerializer, self).get_fields(*args, **kwargs)
    view = self.context['view']
    owner = view.request.user
    fields['line'].queryset = fields['line'].queryset.filter(owner=owner)
    return fields
class EventSerializer(serializers.ModelSerializer) 

我认为更多有价值的信息将是配置和urlconf,请将此添加到问题中,或者提供一些外部小提琴的链接。@Take_Care_uu-谢谢。您可以在[link]()查看url配置文件,[link]()查看应用程序url文件,[link]()查看基本配置文件。如果您喜欢将此信息粘贴到问题中,请告诉我。@Take_Care_u-我终于解决了此问题。结果表明,我的测试模块中有一个轻微的语法错误。我将self.event_data={'pk':line.id..}更改为{'line':line.id..}。此外,在序列化程序模块中,我将类EventSerializer(serializers.HyperlinkedModelSerializer):更改为类EventSerializer(serializers.ModelSerializer):。通过这些更改,我的测试现在可以运行了!