#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)