0

私は django rest フレームワークを学習していますが、ForeignKey モデルとシリアライザーに問題があるようです。2 つのモデルと 2 つのシリアライザーがあります

モデル

class Clients(models.Model):
   client_public_key = models.CharField(max_length=100, default=generate_client_public_key, unique=True)
   client_name = models.CharField(max_length=100, unique=True, null=False)
   client_name_abbr = models.CharField(max_length=100, unique=True, null=True)
   created_by = models.IntegerField(default=1, null=False) #Has to be changed to foreign key
   created_at = models.DateTimeField(auto_now_add=True, null=False)

   class Meta:
      ordering = ["client_name"]

class Users(models.Model):
   client = models.ForeignKey(Clients, on_delete=models.CASCADE)
   user_public_key = models.CharField(max_length=100, null=False, default=generate_client_public_key, unique=True)
   first_name = models.CharField(max_length=100, null=False)
   last_name = models.CharField(max_length=100, null=False)
   email = models.CharField(max_length=100, null=False, unique=True)
   cell = models.IntegerField( null=True)
   support_department = models.CharField(max_length=50, null=False)
   password = models.CharField(max_length=150, null=False)
   user_status = models.IntegerField(null=False)
   password_changed = models.IntegerField(default=0, null=False)
   last_login = models.DateTimeField(null=True)
   created_by = models.IntegerField(default=1, null=False) #Has to be changed to foreign key
   created_at = models.DateTimeField(auto_now_add=True, null=False)

   class Meta:
      ordering = ["first_name"]

シリアライザ

class ClientSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Clients
        fields =  '__all__'
        read_only_fields = ('id','client_public_key')


class UserSerializer(serializers.ModelSerializer):

    # client = ClientSerializer()
    # client = serializers.StringRelatedField()
    class Meta:
        model = Users
        depth = 1
        fields = '__all__'
        read_only_fields = ('id','user_public_key')

で投稿

def create_user(request):
    serializer = UserSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        try:
            queryset = Users.objects.get(email=serializer.data['email'])
            content = {'status_response': 'User Created Successfully'}
            return Response(content, status=status.HTTP_201_CREATED)
        except Users.DoesNotExist:
            content = {'status_response': 'User Not Created'}
            return Response(content, status=status.HTTP_404_NOT_FOUND)
    content = {'status_response': 'User Already Exist'}
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

問題は、UserSerializer に depth=1 を追加すると、データを投稿するときに(1048、"Column 'client_id' cannot be null")エラーが発生することです。私は何を間違っていますか?

4

1 に答える 1

0

それを削除depth=1してコメントを外します

client = ClientSerializer()

それは同じことをdepth=1します。read_only=Trueご希望の方はこちらもご利用ください。

または、クライアントの作成に使用している場合は、Usersモデルで を使用しますrelated_name=users。今、あなたのClientSerializer使用中

users = UserSerializer(read_only=True)

:両方を使用しないでください。無限ループが発生します。

モデル名に複数形を使用しないでください。規則に従うようにしてください。

于 2021-01-16T07:19:25.747 に答える