DRF + DREST: как обеспечить, чтобы во время тестов сериализатор компилировался с тестовыми данными setUp? - PullRequest
0 голосов
/ 12 ноября 2018

Использование

  • Джанго: 1,11
  • Python 3,6
  • DRF: 3,7
  • DREST (он же динамический отдых): 1,8

У меня есть сериализатор, написанный так:

class SubProjectAsFKWithAttachedFieldsSerializer(DynamicModelSerializer):
    # attached_fields = AttachedFieldSerializer(embed=True, many=True)
    try:
        scope_object = UgField.objects.get(dotted_path='global.scope')
        scopes = DynamicRelationField(
            AttachedFieldWithDirectValuesSerializer,
            source='attached_fields',
            many=True,
            embed=True,
            read_only=True,
            queryset=AttachedField.objects.filter(ug_field=scope_object)
        )
    except ObjectDoesNotExist:
        scopes = DynamicRelationField(AttachedFieldWithDirectValuesSerializer,
                                      source='attached_fields',
                                      many=True,
                                      read_only=True,
                                      embed=True)

В настоящее время почти во всех моих tests.py в методе setUp у меня есть

self.global_scope_field = UgFieldFactory(dotted_path='global.scope', name='Scope')

Почему-то эта строка

scope_object = UgField.objects.get(dotted_path='global.scope')

продолжает падать, несмотря на то, что я "создал", используя DjangoModelFactory

Что я должен сделать, чтобы строка всегда проходила при выполнении тестов?

UPDATE

  1. Просто чтобы указать, что у меня на самом деле есть запись UgField со строкой global.scope в качестве значения для поля dotted_path.
  2. Только когда я запускаю python manage.py test, я сталкиваюсь с этой проблемой.
  3. Когда я правильно запускаю приложение, проблем нет.

Я также попытался установить

(self.global_scope_field, created) = UgField.objects.get_or_create(dotted_path='global.scope', name='Scope')

по моему setUp методу.

но тогда я получаю ту же проблему

enter image description here

1 Ответ

0 голосов
/ 13 ноября 2018

Чтобы объект можно было извлечь с помощью .get(), его необходимо сохранить.

self.global_scope_field = UgFieldFactory(dotted_path='global.scope', name='Scope')
self.global_scope_field.is_valid()
self.global_scope_field.save()

В качестве альтернативы вы можете просто создать объект без формы.

self.global_scope_field = UgField.objects.create(dotted_path='global.scope', name='Scope')
...