#django #django-rest-framework
#django #django-rest-framework
Вопрос:
У меня есть метод POST, который будет использоваться для извлечения объекта JSON, который затем будет использоваться для извлечения first_name, last_name и username — хотя я не могу понять, как получить поля (т.Е. username) после его сериализации. Каков наилучший способ сделать это?
views.py
@api_view(['POST'])
def createUser(request):
# Making a Connection w/ MongoClient
client = MongoClient('mongodb srv://test_user:0FP33TLJVWrjl8Vy@cluster0.5sacp.mongodb.net/sample_clubs?retryWrites=trueamp;w=majority')
# Getting the Database
db = client['sample_clubs']
# Getting the Collection/Table
collection = db['users']
serializer = MyUserSerializer(data=request.data)
# Gives bug if next 2 lines aren't here
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
serializers.py
class MyUserSerializer(serializers.ModelSerializer):
def get_first_name(self, obj):
# obj is model instance
return obj.first_name
def get_last_name(self, obj):
# obj is model instance
return obj.last_name
def get_user_name(self, obj):
# obj is model instance
return obj.user_name
class Meta:
model = MyUser
fields = ['first_name', 'last_name', 'username']
# fields = '__all__'
models.py
class MyUser(models.Model):
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
username = models.CharField(max_length=200)
def __str__(self):
return self.username
Комментарии:
1. В чем проблема с текущей настройкой?
2. Вы хотите, чтобы имя пользователя после вызова
serializer.save()
было сохранено, чтобы увидеть, какое имя пользователя было сохранено? или вам нужны необработанные сериализованные данные?3. В настоящее время я не могу понять, что передать в аргумент obj функций get или работают ли они. Я нашел идею для реализации в другом вопросе StackOverflow, однако я не смог найти документацию по нему и застрял на том, как продолжить вызов функций get и получить собственные строки Python для анализа.
4. @NavidZarepak После этого я хотел бы получить имя пользователя в виде строки (я не могу удалить эти 2 строки, иначе я получу сообщение об ошибке)
Ответ №1:
Метод сериализатора save
в DRF вернет экземпляр, который был сохранен. Таким образом, вы можете просто вызвать любое его поле следующим образом:
if serializer.is_valid():
obj = serializer.save()
print(obj.user_name)
Данные также будут доступны через проверенные данные сериализатора:
if serializer.is_valid():
print(serializer.validated_data.get('user_name')
Вы также можете использовать необработанный JSON, сгенерированный serializer:
# note that serializer.data won't be available if 'is_valid()` returns False
print(serializer.data["user_name"])
Кроме того, вы не должны возвращаться serializer.data
за пределы области is_valid
видимости. Если is_valid()
есть False
, то никаких данных не будет, поэтому вы столкнетесь с ошибкой. Правильный способ был бы таким:
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors)
Если вы хотите вернуть только user_name
ответ as:
if serializer.is_valid():
obj = serializer.save()
return Response({"username": obj.user_name})
return Response(serializer.errors)
Комментарии:
1. Большое спасибо, это решило мою проблему!