Я создаю социальную сеть с помощью django, мне нужно создать модель группы с администратором группы, который может выполнять такие действия, как добавление и удаление участников

#django #django-models #django-rest-framework

Вопрос:

Я бы хотел,чтобы при создании группы экземпляр профиля,который создает группу, автоматически становился администратором группы, аналогично, он/она становится членом группы, несколько основных методов, которые были опробованы, возвращали множество ошибок в отношениях, указывающих на добавление, набор функций, как этого можно достичь??, Я использую django restframework.

Групповая модель и сериализатор.

 class Group(models.Model):
    group_name = models.CharField(max_length=200, blank=True)
    description = models.TextField(
        help_text='Describe this group...', max_length=350, blank=True)
    admin = models.OneToOneField(
        "profiles.Profile", blank=True, on_delete=models.SET_NULL, null=True, related_name='group_admin')
    members = models.ManyToManyField(
        "profiles.Profile", blank=True, related_name='members')
    posts = models.ForeignKey(
        "posts.Post", blank=True, on_delete=models.SET_NULL, null=True, related_name='group_posts')
    created_by = models.ForeignKey(
        "profiles.Profile", on_delete=models.SET_NULL, null=True, related_name='group_creator')
    created = models.DateTimeField(auto_now=True)
 
 class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ['id', 'group_name', 'members',
                  'posts', 'created_by', 'created']
        depth = 1
 

Число просмотров

 class GroupViewSet(viewsets.ModelViewSet):

    serialiazer_class = GroupSerializer
    queryset=Group.objects.all()
 

Комментарии:

1. Можете ли вы поделиться своим мнением?

2. Я добавил представление

Ответ №1:

Вы можете переопределить create метод вашего сериализатора и выполнить там свой постпроцесс следующим образом:

 class GroupSerializer(serializers.ModelSerializer):
    ...

    def create(self, validated_data):
        instance = super().create(validated_data)
        request = self.context['request']

        instance.admin = request.user.profile
        instance.save()
        instance.members.add(request.user.profile)
 

ModelViewSet добавляет request в контекст сериализатора, чтобы у вас был доступ, к request.user которому вы затем можете установить в качестве администратора (при profile условии, что он имеет OneToOneField отношение user ).

Комментарии:

1. Большое вам спасибо! хотя я понял, что этот код ограничивает одного пользователя быть только администратором группы в одной группе. При создании другой группы с тем же пользователем, что и администратор, возникает следующая ошибка : Ошибка уникального ограничения: group_group.admin_id

2. Это потому, что вы определили admin как поле «один к одному». Это гарантирует, что поле может быть только уникальным

3. Отредактировал поле до manytomany, и теперь у меня эта ошибка: прямое назначение на переднюю сторону набора «многие ко многим» запрещено. Вместо этого используйте admin.set (). После этого я изменил администрацию, чтобы она была заполнена, как вы сделали это для поля «многие ко многим», и вуаля! я работаю как заклинание.

4. Звучит неплохо! Примите этот ответ, если он вам вообще помог.

5. Эй, Брайан, Проверь мой новый вопрос, пожалуйста

Ответ №2:

Отредактировал поле администратора группы в модели до множества, а затем изменил ответ здесь.

группировщик классов(сериализаторы.Модельериализатор): …

 def create(self, validated_data):
    instance = super().create(validated_data)
    request = self.context['request']

    instance.admin.add(request.user.profile)
    instance.save()
    instance.members.add(request.user.profile)