DRF - Добавить пользователя в модель с помощью ManyToManyField - PullRequest
0 голосов
/ 08 июля 2020

Я пытаюсь реализовать функцию на моем сервере и разрешить владельцу частной «Группы» добавлять других пользователей по их именам вместо идентификаторов и разрешить им добавлять свои изображения в FileField только один раз после того, как они были добавлены в модель. . Код, который у меня есть:

models.py

class Group(models.Model):
    group_name = models.CharField(max_length=255)
    group_text = models.TextField(max_length=360, blank=True)
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL, related_name='owner_user', on_delete=models.SET(get_deleted_user), default=1)
    created_on = models.DateTimeField(auto_now_add=True, null=True)
    shared_to = models.ManyToManyField(UserProfile, blank=True, related_name='shared_to_user', null=True)


    def __str__(self):
        return self.group_name

    def save(self, *args, **kwargs):
        super(Group, self).save(*args, **kwargs)



class GroupImage(models.Model):
    group_file = models.FileField(blank=True, null=True,
                                    upload_to='media/covers/%Y/%m/%D/')

    gallery_group = models.ForeignKey(Group, related_name='images', on_delete=models.CASCADE)

serializers.py

class GroupImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.GroupImage
        fields = ('group_file', )


class SharedToSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.Group
        fields = ('shared_to', )


class GroupSerializer(serializers.ModelSerializer):

    
    images = GroupImageSerializer(many=True, read_only=True)
    person = SharedToSerializer(many=True, read_only=True)


    class Meta:
        model = models.Group
        fields = ('id', 'group_name', 'group_text', 'person', 'images')
        
    def create(self, validated_data):
        images_data = self.context.get('view').request.FILES
        owner_id = self.context['request'].user.id
        gallery_group = models.Group.objects.create(group_name=validated_data.get('group_name', 'no- 
             group_name'), group_text=validated_data.get('group_text'), owner_id=1)
        for image_data in images_data.values():
            models.GroupImage.objects.create(gallery_group=gallery_group, 
                 group_file=image_data)
            return gallery_group

views.py

class GroupCreateAPIView(generics.CreateAPIView):
    queryset = models.Group.objects.all()
    serializer_class = serializers.GroupSerializer
    permission_classes = [AllowAny]

1 Ответ

0 голосов
/ 12 июля 2020

Итак, если ваше единственное требование - как добавлять пользователей по их имени, а не по идентификатору. Вы должны использовать SlugRelatedField. Я также считаю, что ваше соглашение об именах сериализаторов довольно сбивает с толку. Ниже представлен сериализатор для модели Group, который может добавлять пользователей в группу.

class GroupSerializer(Serializer):
    ... other fields here
    shared_to = models.SlugRelatedField(queryset = UserProfile.objects.all(), many=True, slug_field="username", allow_empty=True)
    

Итак, первая проверка SlugRelatedField . Это в основном используется для сопоставления с объектами с использованием специального поля c этого объекта (в данном случае имени пользователя). Затем вы получите все экземпляры UserProfile в поле shared_to свойства validated_data сериализатора, которые вы можете получить в методе create и добавить в свою группу. А затем в api загрузки файла для вашей группы вы можете проверить, принадлежит ли этот пользователь к группе или нет, для проверки прав доступа.

...