Как использовать внутренние соединения таблиц в DRF?
Как реализовать внутреннее объединение данных на DRF. У меня есть два класса моделей user
и client
. Когда я добавляю клиента, я выбираю список пользователей, который обрабатывается этим клиентом. Теперь, когда я получаю список пользователей из 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
serializers.py
class GetAllUserSerializer(serializers.ModelSerializer):
class Meta:
model = get_user_model()
fields = '__all__'
Любые предложения будут очень полезны!
поскольку вы используете 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
)
Тогда
- создайте
ModelSerializer
дляClient
class ClientSerializer(serializers.ModelSerializer):
class Meta:
model = Client
fields = '__all__'
- измените свои
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__'
таким образом, вы сможете получить всех пользователей и их клиентов.
ссылка: