Код, который вы разместили, кажется действительным и правильным.Проблема, однако, не связана.Текст исключения 'QuerySet' object has no attribute 'project_id'
Относится к проблеме, которая, вероятно, возникла из файла views.py приложения restframework.Исключение говорит о том, что вы пытаетесь получить доступ к атрибуту project_id из QuerySet.
QuerySet - это (загруженный ленивый) набор моделей, а не одна модель.Даже если в наборе запросов был только один элемент, вам все равно потребуется доступ к этому элементу до доступа к его атрибутам.
Поскольку вы не предоставили доступ к файлу views.py, я не могу точно сказать, гдепроблема, однако, , вот неправильный пример использования : MyModel.objects.all().project_id
.Здесь мы видим, что я пытаюсь получить доступ к атрибуту project_id
из набора запросов.Правильный вариант использования будет MyModel.objects.all()[0].project_id
.Однако это предполагает, что набор запросов не является пустым.
Практически, большинство представлений DjangoRestFramework наследуются от rest_framework.views.APIView
, который подклассов класса представления django.Я бы посоветовал проверить, что query_set
в этом классе используется правильно.
Не стесняйтесь поделиться своей реализацией здесь для дальнейшего комментария.
[EDIT] - После views.pyдобавлен код.
Вы пытаетесь сериализовать весь набор запросов с созданием экземпляра сериализатора data = AWDSerializer(deployments).data
, это вызывает ошибку атрибута.
Я бы порекомендовал generics.ListAPIView
класс и использование атрибутов класса query_set
и serializer_class
.Это просто реализовать.Затем вы можете вызвать метод get по умолчанию для APIViews.Вот пример для вашего DeploymentsList view
from rest_framework import generics
class DeploymentsList(generics.ListAPIView):
serializer_class = AWDSerializer
queryset = AwdModel.objects.all()
def get(self, request, *args, **kwargs):
MAX_OBJECTS = int(20)
self.queryset = self.queryset[:MAX_OBJECTS]
return super(DeploymentsList, self).get(request, *args, **kwargs)
[EDIT] - FileField Serialization Чтобы сериализовать поле файла UserAccount.credentials, чтобы мы сериализовали путь, мы можем использоватьserializers.SerializerMethodField
.Т.е. ваш UserAccountSerializer становится:
class UserAccountSerializer(serializers.ModelSerializer):
credentials = serializers.SerializerMethodField()
def get_credentials(self, user_account):
return user_account.credentials.path
class Meta:
model = UserAccountModel
fields = ('deployment_name', 'credentials', 'project_name',
'project_id', 'cluster_name', 'zone_region', 'services')