1
저는 Django의 초보자이며 특별히 Django REST 프레임 워크입니다. 사용자의 설정이 들어있는 새 사용자를 POST하려고합니다. Django REST로 OneToOneField를 POST 할 수 없습니다.
이
이 내 serializers.pyfrom rest_framework import serializers
from api.models import User
from api.models import Address
from api.models import Settings
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = ('number', 'streetName', 'zipCode', 'city', 'country')
class SettingsSerializer(serializers.ModelSerializer):
class Meta:
model = Settings
fields = ('cancelTime', 'onlyInWifi')
class UserSerializer(serializers.ModelSerializer):
address = AddressSerializer(required=False)
settings = SettingsSerializer(required=False)
class Meta:
model = User
fields = ('pk','firstName', 'lastName', 'pseudo', 'mail', 'password', 'settings', 'address')
def create(self, validated_data):
if(validated_data.get('address')):
address_data = validated_data.pop('address')
address = Address.objects.create(**address_data)
else:
address = None
if(validated_data.get('settings')):
settings_data = validated_data.pop('settings')
settings = Settings.objects.create(**settings_data)
else:
settings = Settings()
user = User.objects.create(**validated_data)
user.address = address
user.settings = settings
return user
내 models.py
from django.db import models
from datetime import datetime
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())
class Address(models.Model):
number = models.IntegerField(null=True)
streetName = models.CharField(max_length=50, default=None, null=True)
zipCode = models.IntegerField(default=None, null=True)
city = models.CharField(max_length=50, default=None, null=True)
country = models.CharField(max_length=50, default=None, null=True)
class Settings(models.Model):
cancelTime = models.IntegerField(default=5)
onlyInWifi = models.BooleanField(default=False)
class User(models.Model):
firstName = models.CharField(max_length=100)
lastName = models.CharField(max_length=100)
pseudo = models.CharField(max_length=100, default=None)
mail = models.CharField(max_length=100)
password = models.CharField(max_length=250)
address = models.ForeignKey(Address, null=True)
settings = models.OneToOneField(Settings, null=True)
입니다 이것은 내 urls.py
from django.conf.urls import patterns, url
urlpatterns = patterns(
'api.views',
#Users
url(r'^users/$', 'users_list', name='users_list'),
url(r'^users/(?P<pk>[0-9]+)$', 'user_detail', name='user_detail'),
}
입니다 그리고 이것은 내 views.py입니다
import logging
from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response
from api.models import User
from api.serializers import UserSerializer
#Users
@api_view(['GET', 'POST'])
def users_list(request):
"""
List all users, or create a new user.
"""
if request.method == 'GET':
users = User.objects.all()
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = UserSerializer(data=request.DATA)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(
serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
def user_detail(request, pk):
"""
Get, udpate, or delete a specific user
"""
try:
user = User.objects.get(pk=pk)
except User.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = UserSerializer(user)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = UserSerializer(user, data=request.DATA, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(
serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
user.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
난 새 사용자를 게시 할 때 363,210
, 나는
을 원하지만 내 사용자가 잘 추가되었는지 확인하는 API/사용자를로드 할 때, 내 설정 필드가 null의 동작을
문제가 무엇인지 이해할 수 없습니다.
당신이 게시하는지 보여주는 예제 코드를 추가 할 수 있습니까? 또한,'User' 모델은'settings'이 null 인 것을 허용합니다, 맞습니까? –
예 내 설정은 null이 될 수 있지만, 예를 들어 내가 게시 할 때이 : { "firstName을": "firstNameTest" "이 lastName": "lastNameTest" "의사": "pseudoTest" "메일" "[email protected]" "비밀번호": "testPass" "user_settings": { "cancelTime": 50, "onlyInWifi"사실 } } 내가 원하는 행동을 가지고 있지만 내가 방금 추가 한 사용자 개체에서 내 설정이 null 인 경우 API/사용자를로드 할 때 –