2017-08-15 43 views
1

DRFプロジェクトで基本的なメッセージング機能を使用しようとしました。ネストされたシリアライザの検証に問題があるようです。私はDRFの新人で、数日間はドキュメントを読んでいましたが、何かを見逃しているに違いありません。 self: unable to get repr for <class 'django.db.models.query.QuerySet'> model: <class 'accounts.models.Message'> query: none using: noneNestedシリアライザで「QuerySetクラスのreprを取得できません」というエラーが発生しました。エラー

これはと思われる:

エラーがIntegrity error, NOT NULL constraint failed on accounts_message.sender_idを返しますが、デバッグを通じて、私はこれはクエリセット方法にquery.pyのエラーが原因で発生していることを発見した私のserializer.The要求にラインmessage = Message.objects.create(**validated_data)の内部で起こりますシリアライザによって生成されたdictは、仮定されたnull sender_idを含むリクエストのすべてのデータが渡されているように見えるので、私の問題を引き起こす原因となります。しかし、私はこの問題を解決する方法がわかりません。私はreprを無効にする必要がありますか?またはクエリセット?これは、IMが比較的単純な何かにこだわっているように感じます。

Serializers.py

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = User 
     fields = ('id', 'name', 'email') 
     extra_kwargs = { 
      'id': { 
       'validators': [UnicodeUsernameValidator()], 
      } 
     } 

class MessageSerializer(serializers.ModelSerializer): 
    sender = UserSerializer() 
    recipients = UserSerializer(many=True) 


    class Meta: 
     model = Message 
     fields = ('id', 'subject', 'body', 'read', 'sender', 'recipients') 


    def create(self, validated_data): 
     sender_data = validated_data.pop('sender') 
     recipient_data = validated_data.pop('recipients') 
     message = Message.objects.create(**validated_data) 

     for user in recipient_data: 
      user= User.message_recip.get_or_create(id=user['id'], name=user['name']) 
      message.recipients.add(user) 

     for user in sender_data: 
      user= User.objects.get_or_create(id=user['id'], name=user['name']) 
      message.sender.add(user) 
     return message 

Models.py

from django.db import models 

class User(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=30) 
    email = models.CharField(max_length=75) 

    def __str__(self): 
     return self.name 

class Message(models.Model): 
    id = models.IntegerField(primary_key=True) 
    subject = models.CharField(max_length=250) 
    body = models.CharField(max_length=5000) 
    read = models.BooleanField(default=False) 
    sender = models.ForeignKey(User, related_name='message_sender') 

    recipients = models.ForeignKey(User, related_name='message_recip', default=1) 

Views.py

class MessageList(APIView): 

    def get(self, request): 
     messages = Message.objects.all() 
     serializer = MessageSerializer(messages, many=True) 
     return Response(serializer.data) 

    def post(self, request): 
     serializer = MessageSerializer(data=request.data) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 


class User(APIView): 

    def get(self, request): 
     user = User.objects.get(id) 
     serializer = UserSerializer(user, many=False) 
     return Response(serializer.data) 

答えて

0

あなたが与える場合はForeignKeysにとblank=Trueオプションを指定すると、もうIntegrityErrorを取得できなくなります。 null &ブランクオプションを追加していないので、Django ORMはDBに制約を作成し、外部キーに空の値を追加することはできません。 Django Model Field Reference

+0

QuerySetのエラーは依然として問題の根本にあるようですが、その一部を助けてくれてうれしいです。私はまだクエリセットエラーのためのreprを見つけることができませんが、UserオブジェクトのMessageオブジェクトではありません。病気のモデルフィールドの参照を見てみましょう... –

関連する問題