2016-04-02 18 views
3

'da seri hale getirici kullanan iç içe geçmiş nesnelerle nesneleri nasıl oluşturabilirim Bir bekçi oluşturmak istiyorum. Bu benim modelidir: 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) 

Eğer django.contrib.auth.models.User bir ilişki oneTOone var Gördüğünüz gibi

.

Benim API görünümü

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 

Sorum şu ... şu

@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) 

Benim serileştiricisi sınıfları:

{ 'kullanıcı adı': 'xxx' gibi veri göndermeyi , 'Parola': 'xxx', 'email': '[email protected]', 'name': 'John Smith' ... }

Kullanıcıyı oluşturmak için kullanıcı adı ve parolayı nasıl bölebilirim ve sonra bu nesneyi bekçi oluşturmak için kullanabilir miyim? Validated_data, bana sadece bakıcı modelinin alanlarını verdi. Eğer iç içe bir kullanıcı serileştirici kullanıyor gibi

cevap

3

böyle veri göndermek olmalıdır: Sonra

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

Eğer validated_data bir user öğe olması ve kullanıcı örneğini oluşturabilirsiniz:

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

Don Kullanıcı örneğini db:

'unuzdaki doğru ilişkileri elde etmek için create() yöntemine geçirmeyi unutmayın

JSON içindeki alanlarınız, modelinize karşılık geldiğinden, kod satırlarınızı azaltabilirsiniz.

İlgili konular