2014-12-27 2 views
1

저는 Django의 초보자이며 특별히 Django REST 프레임 워크입니다. 사용자의 설정이 들어있는 새 사용자를 POST하려고합니다. Django REST로 OneToOneField를 POST 할 수 없습니다.

이 내 serializers.py

from 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의 동작을

문제가 무엇인지 이해할 수 없습니다.

+0

당신이 게시하는지 보여주는 예제 코드를 추가 할 수 있습니까? 또한,'User' 모델은'settings'이 null 인 것을 허용합니다, 맞습니까? –

+0

예 내 설정은 null이 될 수 있지만, 예를 들어 내가 게시 할 때이 : { "firstName을": "firstNameTest" "이 lastName": "lastNameTest" "의사": "pseudoTest" "메일" "[email protected]" "비밀번호": "testPass" "user_settings": { "cancelTime": 50, "onlyInWifi"사실 } } 내가 원하는 행동을 가지고 있지만 내가 방금 추가 한 사용자 개체에서 내 설정이 null 인 경우 API/사용자를로드 할 때 –

답변

0

serializers.py 파일에 사용자 개체를 만들려면 settingsaddress을 추가해야합니다.

그래서 대체 :

user = User.objects.create(**validated_data) 
user.address = address 
user.settings = settings 

기준 :

validated_data['address'] = address; 
validated_data['settings'] = settings; 
user = User.objects.create(**validated_data) 
관련 문제