2016-03-07 4 views
1

Я только начал использовать фреймворк django rest, и это может быть старый вопрос, но до сих пор я не нашел для него правильного ответа на SO.Django REST: Объедините две модели

Я хочу добавить дополнительные поля профиля в существующую модель пользователя, предоставленную DRF. Прочитав документ, я решил создать новую модель CustomUser и связать ее с моделью пользователя по умолчанию с помощью внешнего ключа.

Вопрос возник, когда я пытался сериализовать модель CustomUser. Я хочу быть JSON как это:

{ 
    "username" : "from_default_user_model", 
    "extra_field" : "from_custom_user_model" 
} 

, но с использованием вложенных сериализаторов следующим образом, я получил вложенное представление JSon.

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('username',) 

class CustomUserSerializer(serializers.ModelSerializer): 
    user = UserSerializer() 
    class Meta: 
     model = CustomUser 
     fields = ('extra_field',) 

вложенные один выглядит следующим образом:

{ 
    "username" : "from_default_user_model", 
    "user" : 
      { 
       "extra_field" : "from_custom_user_model" 
      } 
} 

То, что я хочу, это свой рода как база данных соединения между двумя таблицами, которые просто дают простую таблицу, а не вложенная один. Как я мог это достичь?

ответ

2

Я предполагаю, что вы собираетесь использовать по умолчанию модели Us Джанго как OneToOneField с пользовательской моделью пользователя , Вам не нужен другой сериализатор для модели пользователя. Поскольку дополнительные поля будут в CustomUser, достаточно написать сериализатор только для пользовательского пользователя.

from django.contrib.auth.models import User 
class CustomUser(models.Model): 
    user = models.OneToOneField(User) 
    # Add your extra fields here. 

Это, как вы это делаете:

CustomUserSerializer(serializers.ModelSerializer): 
    username = Serializers.CharField(source='user.username') 
    email = Serializers.EmailField(source='user.email') 

    class Meta: 
     model = CustomUser 
     fields = ('username', 'email', 'extra_fields_from_CustomUser',) 

К счастью, source позволяет достичь вашего OneToOneField легко, так что вы ничего не нужно.

+0

Это решает мою проблему, но указание типа каждого поля снова может быть немного утомительным, особенно если вы не уверены в исходном типе поля. Например, вам нужно указать 'last_login = serializer.DateTimeField (source = 'user.last_login')', а не 'DateField (source = 'user.last_login')'. Последнее даст вам отказ от утверждения. – AveryLiu

+0

Да, это может быть утомительно, но вы сделаете это только для модели пользователя, поэтому это не слишком большая работа. –

1

На модели CustomUser, создать ярлык свойства, а затем добавить его к определению полей в мета

@property 
def username(self): 
    return self.user.username 

class meta: 
    model = ... 
    fields = ("username", "extra-field",...) 
+0

Не могли бы вы рассказать о нем немного больше? Спасибо, я ошибся ** Неправильноконфигурированный **, пытаясь ответить на ваш вопрос. – AveryLiu

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