Как сделать 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

Вернуться на верх