Как сделать POST-запрос в поле ManyToManyField?
У меня есть модель UserAccess, которая содержит два поля user и articles. Поле articles является ManyToManyField по отношению к модели Article, поэтому каждый пользователь имеет одинаковый список статей, связанных с ним. Я хочу изменить поле is_blocked с помощью POST-запроса так, чтобы каждая статья для каждого пользователя блокировалась индивидуально. Как это сделать?
models.py
class UserAccess(models.Model):
user = models.ForeignKey(User,
on_delete=models.CASCADE,
null=True,
)
articles = models.ManyToManyField('Article')
def __str__(self):
return str(self.user)
class Meta:
verbose_name = "access"
verbose_name_plural = 'access'
class Article(models.Model):
title = models.CharField(max_length=256)
label = models.ImageField(
upload_to='uploads/labels',
blank=True,
)
is_blocked = models.BooleanField(default=True)
def __str__(self):
if self.is_blocked == True:
return f"‚{str(self.pk)}: {str(self.title)}"
return f"{str(self.pk)}: {str(self.title)}"
class Meta:
ordering = ('pk',)
verbose_name = "Article"
verbose_name_plural = "Article"
serializers.py
class ArcticleSerializer(ModelSerializer):
class Meta:
model = Article
fields = [
"pk",
"title",
"label",
"is_blocked",
]
class CurrentUserSerializer(ModelSerializer):
class Meta:
model = User
fields = ["username"]
class UserAccessSerializer(ModelSerializer):
articles = ArcticleSerializer(many=True)
user = CurrentUserSerializer(read_only=True)
class Meta:
model = UserAccess
fields =[
"user",
"articles",
]
read_only_fields = ('created','updated')
views.py
class UserAccessViewSet(ModelViewSet):
serializer_class =UserAccessSerializer
pagination_class = StandardResultsSetPagination
def get_queryset(self):
user = self.request.user
return UserAccess.objects.filter(user=user)
Вам нужно сделать это с помощью сквозной модели Django docs
class UserAccess(models.Model):
user = models.ForeignKey(User,
on_delete=models.CASCADE,
null=True,
)
articles = models.ManyToManyField('Article',
through='ArticleBlocked',
through_fields=('useracces', 'article'),)
def __str__(self):
return str(self.user)
class Meta:
verbose_name = "access"
verbose_name_plural = 'access'
class Article(models.Model):
title = models.CharField(max_length=256)
label = models.ImageField(
upload_to='uploads/labels',
blank=True,
)
def __str__(self):
if self.is_blocked == True:
return f"‚{str(self.pk)}: {str(self.title)}"
return f"{str(self.pk)}: {str(self.title)}"
class Meta:
ordering = ('pk',)
verbose_name = "Article"
verbose_name_plural = "Article"
class ArticleBlocekd(models.Model):
useracces = models.ForeignKey(UserAcces, on_delete=models.CASCADE)
article = models.ForeignKey(Articles, on_delete=models.CASCADE)
is_blocked = models.BooleanFiled(default=True)
Таким образом, каждая пара (useracces, article) имеет поле is_blocked