2017-11-16 12 views
0

*更新1:今シリアライザコードDRFシリアライザリレーションズ/ JSON APIフレームワーク

に示す対応するエラーの試み*アップデート2:私は、私は

を使用してい JSON Api frameworkとの競合に問題を狭めてきました

私はPythonとDjangoにはかなり新しいです。私はかなりの関係で苦労しています。私はデータベース内の関係を作成することができますが、私は非常に簡単に見えるdocumentationのすべてのメソッドを試しても応答オブジェクトのモデルを一緒にシリアル化することができませんでした。私の目標は、ログイン時にAPIViewから両方のモデルを返すことです。このコードでエラーが発生しない場合は、ユーザーモデルだけで応答が得られます。エラーはさまざまなテクニックに基づいて変化し、リレーションで問題が発生したときに他のユーザーが取得するものと似ていますが、修正によって問題が解決されませんでした。

私が正しいことをしていないことが明らかであるかどうか疑問に思います。もっとコードを分かち合うのはうれしいですが、どうやって進めるのか本当に迷っています。

FYI:FK参照がある理由users.User

私のモデルは、異なるアプリケーションであるある

モデル:

class User(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(max_length=50, unique=True) 
    password = models.CharField(max_length=100) 
    name = models.CharField(max_length=50) 
    is_active = models.BooleanField(default=True) 
    is_staff = models.BooleanField(default=False) 
    has_business = models.BooleanField(default=False) 

    objects = UserManager() 
    USERNAME_FIELD = 'email' 

    REQUIRED_FIELDS = ['password'] 

    def get_full_name(self): 
     return self.name 

    def get_short_name(self): 
     return self.name 

    def __str__(self): 
     return self.email 

class Business(models.Model): 
    name = models.CharField(max_length=50, unique=True) 
    address = models.CharField(max_length=100) 
    phone = models.CharField(max_length=20) 
    description = models.CharField(max_length=500) 
    user = models.ForeignKey(
     'users.User', 
     related_name='business', 
     unique=False, 
     on_delete=models.CASCADE 
     ) 
    has_driver = models.BooleanField(default=False) 
    is_active = models.BooleanField(default=True) 
    created = models.DateTimeField(auto_now_add=True) 

シリアライザ:

class UserSerializer(serializers.ModelSerializer): 

    token = srs.SerializerMethodField() 

biz = BusinessSerializer(many=True, read_only=True, 
source='business.id') 
error: just returns user model 

biz = BusinessSerializer(read_only=True, many=True, source='business') 
error: ForeignKey' object has no attribute 

biz = serializers.RelatedField(many=True, read_only=True) 
error: 'User' object has no attribute 'biz' 

biz = serializers.ReadOnlyField(source='businesses.id') 
error: RelatedManager object at 0x7fed496fe208> is not JSON 
serializable 

biz = serializers.PrimaryKeyRelatedField(many=True, read_only=True) 
error:'User' object has no attribute 'biz' 

    class Meta: 
     model = models.User 
     fields = ('id', 'email', 'password', 'name', 'token', 'has_business', 'biz') 
     extra_kwargs = {'password': {'write_only': True}} 

    def create(self, validated_data): 

     user = models.User(
       email = validated_data['email'], 
       name = validated_data['name'], 
       phone = validated_data['phone'], 
       location = validated_data['location'], 
      ) 
     user.set_password(validated_data['password']) 
     user.save() 

     return user 

ビュー:

class LoginUser(APIView): 
    permission_classes = (permissions.AllowAny,) 
    resource_name = 'users' 

    def post(self, request): 
     email = request.POST.get('email', False) 
     password = request.POST.get('password', False) 

     if(email and password): 

      lu = UserAuth() 
      authenticated_user = lu.auth(email=email, password=password) 

      if authenticated_user is not None: 
       if authenticated_user.is_active: 

        serializer = serializers.UserSerializer(authenticated_user, context={'request': request}) 
        return Response(serializer.data, status=status.HTTP_200_OK) 
+0

PIPさて、あなたはここで、これらの2つのモデルに関するいかなるシリアライザコードを持っていない:

ここでは、この日のように安定したバージョンです。あなたが試したこととあなたが得たエラーを示すべきです。 –

+0

あなたの 'UserSerializer'は関係を含んでいません。' biz'フィールドはあなたの 'User'モデルのいずれのフィールドとも関係しません。 –

+0

ありがとうございます。シリアライザコードにエラーのある試行を追加しました。 –

答えて

0

あなたシリアライザでrelated_nameを使用する必要があります。

あなたはトラックモデル(ビジネスモデルにアナログ)フィールドがrelated_name =とalbumと呼ばれていますがAlbumSerializerに続いて

「を追跡する」ことがわかります。この例では見here

を取ることができます(あなたのユーザーモデルアナログ):

class AlbumSerializer(serializers.ModelSerializer): 
    tracks = serializers.StringRelatedField(many=True) 

    class Meta: 
     model = Album 
     fields = ('album_name', 'artist', 'tracks') 

そうは、要約すると、あなたのrelated_name business

を使用する必要があります

これはStringRelatedFieldと例ですが、もちろんthis

+0

"ForeignKeyオブジェクトには属性がありません"というエラーが表示されます。 –

0

私はベータ版(djangorestframework-jsonapi == 2.0.0-beta.1をインストールPIP)のを使用していたが判明を使用して完全なオブジェクトを返すことができますJSON API Frameworkと非常によく関係を処理していませんでした。私はベータ版を選んだのは、それが奇妙なドキュメンテーションのリストだったからです。より安定版のために少し掘り下げなければなりません。私はどれくらいの時間がわかりましたか、私は恥ずかしいです。 djangorestframework-jsonapi ==をインストール2.2.0

関連する問題