2016-03-07 44 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

我猜你會使用Django的默認的用戶模型作爲OneToOneField與您的自定義用戶模型。用戶模型不需要另一個序列化程序。由於額外的字段將在CustomUser中,因此僅爲Custom User編寫序列化程序就足夠了。

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