【问题标题】:How to use inner join tables in the DRF?如何在 DRF 中使用内连接表?
【发布时间】:2022-01-26 05:17:15
【问题描述】:

如何在 DRF 上实现内部联接数据。我有两个模型类,一个是userclient。当我添加客户端时,我正在选择由该客户端处理的用户列表。现在,当我从 API 获取用户列表时,我还需要该 API 中的客户端名称。我的模态类是:

class User(AbstractBaseUser, PermissionsMixin):
    identifier = models.UUIDField(default=uuid.uuid4, editable=False, serialize=False, verbose_name='identifer')
    email = models.EmailField(max_length=255, unique=True)
    name = models.CharField(max_length=255)
    image = models.ImageField(null=True, upload_to=user_image_file_path)
    contact_no = models.CharField(max_length=255, default='')

class Client(models.Model):
    name = models.CharField(max_length=200)
    main_contact = models.ForeignKey(
        'User',
        on_delete=models.CASCADE,
        related_name="main_contact",
        null=True
    )
    users = models.ManyToManyField(
        User,
        related_name="users"
    )

views.py

class GetAllUserList(generics.ListAPIView):
    permission_classes = (permissions.IsAuthenticated, jwtPermissions.IsSSOAdminOrReadOnly,)
    queryset = User.objects.all()
    pagination_class = PostLimitOffsetPagination
    serializer_class = GetAllUserSerializer

序列化器.py

class GetAllUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = get_user_model()
        fields = '__all__'

任何建议都会有很大帮助!

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    由于您使用的是 DRF,一种简单的方法是依赖 DRF 内置功能:

    为了清楚起见,假设这是您的models.py

    class User(models.Model):
        identifier = models.UUIDField(default=uuid.uuid4, editable=False, serialize=False, verbose_name='identifer')
      
    
    class Client(models.Model):
        name = models.CharField(max_length=200)
        main_contact = models.ForeignKey(
            'User',
            on_delete=models.CASCADE,
            related_name="main_contact",
            null=True
        )
    
    

    然后

    1. Client 创建一个ModelSerializer
    class ClientSerializer(serializers.ModelSerializer):
        class Meta:
            model = Client
            fields = '__all__'
    
    1. 如下更改您的UserSerializer
    class UserSerializer(serializers.ModelSerializer):
        clients = ClientSerializer(many=True, source='main_contact')
        queryset = User.objects.prefetch_related('main_contact').all()
        class Meta:
            model = User
            fields = '__all__'
    
    

    这样,您应该也可以获取所有用户及其客户。

    参考:

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2015-04-02
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多