DRFプロジェクトで基本的なメッセージング機能を使用しようとしました。ネストされたシリアライザの検証に問題があるようです。私はDRFの新人で、数日間はドキュメントを読んでいましたが、何かを見逃しているに違いありません。 self: unable to get repr for <class 'django.db.models.query.QuerySet'> model: <class 'accounts.models.Message'> query: none using: none
Nestedシリアライザで「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)
QuerySetのエラーは依然として問題の根本にあるようですが、その一部を助けてくれてうれしいです。私はまだクエリセットエラーのためのreprを見つけることができませんが、UserオブジェクトのMessageオブジェクトではありません。病気のモデルフィールドの参照を見てみましょう... –