2016-10-10 20 views
0

Django DRFバージョン3.4.7のPrimaryKeyRelatedFieldシリアル化についての質問。PrimaryKeyRelatedFieldのDjango DRFシリアライザ

モデル

class UserModel(AbstractEmailUser): 

    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return str(self.email) 
class Conversation(models.Model): 
    admin = models.ForeignKey('UserModel', db_index=True, related_name='admin_user') 
    patient = models.ForeignKey('UserModel', db_index=True) 

    subject = models.CharField(max_length=255, db_index=True) 

    user_reply = models.BooleanField(default=False) 
    admin_seen = models.BooleanField(default=False) 

    expire = models.DateTimeField() 

    conversation_type = models.ForeignKey('ConversationType', db_index=True) 

    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return str(self.admin) 


class ConversationMessages(models.Model): 

    text = models.TextField(db_index=True) 

    conversation = models.ForeignKey('Conversation', db_index=True, related_name='msg_conv') 
    user = models.ForeignKey('UserModel', db_index=True) 

    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

    def __str__(self): 
     return str(self.user) 


class ConversationFiles(models.Model): 
    message = models.ForeignKey('ConversationMessages', db_index=True, related_name='message') 
    file = models.FileField(upload_to='conversations', db_index=True) 

    def __str__(self): 
     return str(self.user) 

すべてのモデルは残りのフレームワークのためのフィールドを関連しています。 ロジックは会話を作成し、会話からIDを取り出してメッセージモデルを保存します。

シリアル化の

class MessagesSerializer(serializers.ModelSerializer): 
    text = serializers.CharField(required=False) 
    conversation = serializers.PrimaryKeyRelatedField(queryset=Conversation.objects.all(), required=False) 
    user = serializers.PrimaryKeyRelatedField(queryset=UserModel.objects.all(), required=False) 

    class Meta: 
     model = ConversationMessages 



class ConversationSerializer(serializers.ModelSerializer): 

    admin = serializers.PrimaryKeyRelatedField(queryset=UserModel.objects.all(), required=False) 
    msg_conv = MessagesSerializer() 

    class Meta: 
     model = Conversation 

    def create(self, validated_data): 
     msg_conv = validated_data.pop('msg_conv', None) 
     admin_user = Conversation.objects.create(**validated_data) 
     ConversationMessages.objects.create(conversation_id=Conversation.objects.get(id=admin_user.id).id, **msg_conv) 

     return admin_user 

シリアライザは、POSTメソッドでの問題があります。すべてが素晴らしいPOSTオブジェクトはデータベースにデータを作成しますが、問題はシリアライザオブジェクトがこのメッセージを受け取るときです。'RelatedManager'オブジェクトには 'conversation'という属性がありません

ビュー

class ConversationView(APIView): 

    authentication_classes = (JSONWebTokenAuthentication,) 

    @parser_classes((FormParser, MultiPartParser, FileUploadParser)) 
    def post(self, request): 
     admin = request.user.id 
     data = request.data 

     my_time = datetime.datetime.strptime('07/05/15', '%m/%d/%y') 
     my_time = my_time.replace(hour=23, minute=59) 

     data['admin'] = admin 
     data['expire'] = my_time 

     data['msg_conv']['user'] = admin 

     serializer = ConversationSerializer(data=data) 

     if serializer.is_valid(): 
      serializer.save() 

      return Response(data={'success': True, 'user': serializer.data}, status=status.HTTP_200_OK) 
     else: 
      return Response(data={'success': False, 'msg': serializer.errors}, status=status.HTTP_400_BAD_REQUEST) 

POSTのJSON

{ 

     "subject":"aloha", 
     "conversation_type":1, 
     "patient":3, 

    "msg_conv":{ 
     "text":"ovo je neki teks" 
    } 
} 

表示するには、シリアライザからのデータを返す方法を見つけ出すことはできません。

Djangoのバージョン:1.10.2 のPython:3.4.3

答えて

1

問題があるが:

class ConversationSerializer(serializers.ModelSerializer): 

    msg_conv = MessagesSerializer() 

これを行うことにより、あなたはConversationMessageにFKを持っていると言っています。そのため、DRFはマッピングを実行しようとしますが、それはopositであるため失敗します。

DRFが逆FKであることを知るには、many=True引数を追加するだけです。

関連する問題