2017-08-22 11 views
0

私はDjango restフレームワークをWebサイトで使用しています。Django RESTフレームワークで最後のログをシリアライズ

しかし、私はちょうどちょうどこのように、speical問題を満たす:

models.py

class User(models.Model): 
    uid = models.IntegerField(
     primary_key=True, 
    ) 
    name = models.CharField(
     max_length=15, 
    ) 

class LoginLog(models.Model): 
    sn = models.AutoField(
     primary_key=True, 
    ) 
    user = models.ForeignKey(
     to=User, 
    ) 
    time = models.IntegerField(
     null=False, 
    ) 
    IP = models.CharField(
     max_length=20, 
     verbose_name='Login IP', 
    ) 

serializers.py

私は最後 LoginLogをシリアル化するにはどうすればよい
class UserSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = User 
     fields = '__all__' 

class UserListView(generics.ListAPIView,): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

UserSerializer ?ただ、このようなJSONデータを返す

{ 
    "name": "admin", 
    "uid": 1, 
    "last_login": { 
     "time": 1503414665, 
     "IP": "127.0.0.1" 
    } 
} 

答えて

0

可能な解決策は、SerializerMethodFieldを使用することができます。

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    login_log = serializers.SerializerMethodField() 

    class Meta: 
     model = User 
     fields = '__all__' 

    def get_login_log(self, obj): 
     last_login_log = obj.__class__.objects.filter(user=obj.user).last() 
     login_log_serializer = LoginLogSerializer(last_login_log) 

     return login_log_serializer.data 
  • obj.__class__は、単にあなたがそれらのエントリをフィルタ次にLoginLog
  • を再現します、あなたのユーザーに関連しています
  • last()を取得してシリアル化して返します。

これは簡単で簡単なのかどうかは議論の余地がありますが、望む結果が得られます。それは少しハッキーです。

あなたはこれを見て持つことができます:あなたが時間をしたいだけのでReturn only last entry of related model in serializer - Django

+0

私はちょうど試しましたが、これは次のようにエラーを返します: 'LoginLogはJSONをシリアル化できません。 ' – YYLeo

+0

@YYLeo私は間違いを認識しました。私はおそらく動作する解決策で私の答えを更新しました。 – wencakisa

+0

@YYLeoまた、これはネストされた関係であるため、 'LoginLogSerializer'を実装する必要があります。 – wencakisa

0

を、全体ではなく、実体:

class UserSerializer(serializers.HyperlinkedModelSerializer): 
    last_login_time = serializers.SerializerMethodField() 

    def get_last_login_time(self, obj): 
     last_login = obj.loginlog_set.last() 
     if last_login is not None: 
      return last_login.time 
     return None 

    class Meta: 
     model = User 
     fields = ('uid', 'account', 'last_login_time') 

をまた、ホワイトリストでモデルのすべてのフィールドをデフォルトでは問題が発生する可能性があるため、お勧めしません。明示的(上記と同様)。

+0

問題が解決しました、ありがとうございます! – YYLeo

関連する問題