2016-04-02 14 views
3

私は世話人を作りたいと思います。これは私のモデルです:Django RESTのシリアライザを使用してネストされたアイテムを持つオブジェクトを作成するには

class Caretaker(models.Model): 
    user = models.OneToOneField(User) 
    language = models.ForeignKey('Translation', blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('language')) 
    patients = models.ManyToManyField('Patient', through='CaretakerPatient') 
    specialists = models.ManyToManyField('Caretaker', through='CaretakerSpecialist') 
    name = models.CharField(_('name'), max_length=50) 
    email = models.CharField(_('e-mail'), max_length=100) 
    time_zone = models.CharField(_('time zone'), max_length=50) 
    is_primary = models.BooleanField(default=False) 
    active = models.BooleanField(default=True) 

ご覧のとおり、1つのトーンとdjango.contrib.auth.models.Userの関係があります。

私のAPIのビューには、次の

@csrf_exempt 
@api_view(['POST']) 
@renderer_classes((CustomJSONRenderer,)) 
def create_user(request): 
    serializer = CaretakerSerializer(data=request.data) 
    if serializer.is_valid(): 
     serializer.save() 
     return Response(serializer.data, status=201) 
    return Response(serializer.errors, status=400) 

マイシリアライザクラスです...

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 

class CaretakerSerializer(serializers.ModelSerializer): 
    user = UserSerializer() 
    language = serializers.SlugRelatedField(slug_field='language_code', read_only=True) 
    time_zone = serializers.StringRelatedField() 

    class Meta: 
     model = Caretaker 
     fields = ('id', 'user', 'language', 'name', 'email', 'time_zone', 'active') 

    def create(self, validated_data): 
     print validated_data 
     user = User(
      email=validated_data['email'], 
      username=validated_data['username'] 
     ) 
     user.set_password(validated_data['password']) 
     user.save() 
     caretaker = Caretaker.objects.create(**validated_data) 
     return caretaker 

私の質問は:

{ 'ユーザ名': 'XXX' のようなデータ送信します、 'パスワード': 'xxx'、 'メールアドレス': '[email protected]'、 '名前': 'John Smith' ... }

最初にユーザーを作成してこのオブジェクトを使用してケアテイカーを作成するには、ユーザー名とパスワードをどのように分けることができますか? validated_dataはちょうど私に世話人モデルのフィールドを与えました。

答えて

3

あなたは、このようなデータを送信する必要があり、ネストされたユーザー・シリアライザを使用しているとおり:

{"user": {"username": "xxx", "password": "xxx", ...}, 
"language": "...", 
... 
} 

を次にあなたがvalidated_datauserアイテムを持っており、ユーザーインスタンスを作成することができます。

def create(self, validated_data): 
    user_data = validated_data.pop('user') 
    user = User(
     email=user_data['email'], 
     username=user_data['username'] 
    ) 
    user.set_password(user_data['password']) 
    user.save() 
    caretaker = Caretaker.objects.create(**validated_data) 
    return caretaker 
0

ドンdb内の正しい関係を得るために、Caretakerモデルのcreate()メソッドにUserインスタンスを渡すことを忘れないでください。

def create(self, validated_data): 
    user_data = validated_data.pop('user') 
    user = User.objects.create(**user_data) 
    # pass the newly created user instance here 
    caretaker = Caretaker.objects.create(user=user, **validated_data) 
    return caretaker  

JSON内のフィールドの名前がモデルに対応しているので、コード行を減らすことができます。

関連する問題