2016-10-11 3 views
1

Я новичок в Django отдыхать и сериализаторов концепцияDjangoRest сериализаторов: Сохранить ForeignKey отношение и сериализировать

У меня есть такой структуры БД

Пользователь 1-> N Адрес, пользователя 1-> N Телефон

User является django.contrib.auth.models.User. Address и Phone обе модели содержит это поле user_id = models.ForeignKey(User, on_delete=models.CASCADE)

В моей UserSerializer выглядит как этот

class UserSerializer(serializers.ModelSerializer): 

    address = AddressSerializer(many=False) 
    phone = PhoneSerializer(many=False) 

    class Meta: 
     model = User 
     fields = (
      'id', 'username', 
      'first_name', 'last_name', 
      'email', 'password', 
      'address', 'phone') 

    def create(self, validated_data): 
     # Save user. 
     user = User.objects.create(
       first_name=validated_data['first_name'], 
       last_name=validated_data['last_name'], 
       username=validated_data['username'], 
       email=validated_data['email'], 
      ) 
     user.set_password(validated_data['password']) 
     user.save() 
     # User's address 
     address_data = validated_data['address'] 
     address_data['user_id'] = user.id 
     address = Address.objects.create(**address_data) 
     # User's phone 
     phone_data = validated_data['phone'] 
     phone_data['user_id'] = user.id 
     phone = Phone.objects.create(**phone_data) 
     return user 

И AddressSerializer:

class AddressSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Address 
     fields = (
       'user_id', 'address', 'pin_code', 'state', 'city', 'country') 

Я могу создать User, но при этом serializer.data я получаю это ошибка:

AttributeError: Got AttributeError when attempting to get a value for field `address` on serializer `UserSerializer`. 
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance. 
Original exception text was: 'User' object has no attribute 'address'. 

EDIT:

Мой create метод выглядит следующим образом

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

сделал мой ответ, решив вашу проблему? –

+0

Вы не видите уведомления к моим ответам в комментариях к моему ответу? –

+0

@SardorbekImomaliev Я вижу уведомление. Извините, не проверял браузер. –

ответ

1

Ваши поля для адреса и телефона должны быть названы address_set и phone_set, если не указано явно related_name

class UserSerializer(serializers.ModelSerializer): 
    address_set = AddressSerializer(many=False) 
    phone_set = PhoneSerializer(many=False) 

    class Meta: 
     model = User 
     fields = (
      'id', 'username', 
      'first_name', 'last_name', 
      'email', 'password', 
      'address_set', 'phone_set' 
     ) 

или

class UserSerializer(serializers.ModelSerializer): 
    address = AddressSerializer(many=False, source='address_set') 
    phone = PhoneSerializer(many=False, source='phone_set') 

    class Meta: 
     model = User 
     fields = (
      'id', 'username', 
      'first_name', 'last_name', 
      'email', 'password', 
      'address', 'phone' 
     ) 
+0

К сожалению, я не получил его. Можете ли вы добавить пример своего ответа? –

+0

@ De̳̳ath-Stalke̳̳r см. Обновление –

+0

Я получаю сообщение об ошибке 'AssertionError: поле 'phone' было объявлено в сериализаторе UserSerializer, но не было включено в опцию 'fields'. ' –

 Смежные вопросы

  • Нет связанных вопросов^_^