【问题标题】:Django Rest Framework - How to make extra query before serializer.saveDjango Rest Framework - 如何在 serializer.save 之前进行额外查询
【发布时间】:2022-01-19 18:10:36
【问题描述】:

我是 Django Rest Framework 的新手,我正在尝试做这个简单的事情,但我不知道该怎么做。

所以,这是我的models.py

class Category(models.Model):

    name = models.CharField(max_length=250)
    slug = models.SlugField(max_length=250, unique=True) 
    email = models.EmailField(_('email address'), blank=True, null=True)

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name


class Report(models.Model):

    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    description = models.TextField()
    address = models.CharField(max_length=500)
    reporter_first_name = models.CharField(max_length=250)
    reporter_last_name = models.CharField(max_length=250)
    reporter_email = models.CharField(max_length=250)
    reporter_phone = models.CharField(max_length=250)
    report_image_1 = models.ImageField(_("Image"), upload_to=upload_to, null=True, blank=True)
    report_image_2 = models.ImageField(_("Image"), upload_to=upload_to, null=True, blank=True)
    report_image_3 = models.ImageField(_("Image"), upload_to=upload_to, null=True, blank=True)
    date = models.DateTimeField(default=timezone.now)

    class Meta:
        ordering = ('-date',)

    def __str__(self):
        return self.description

我在 React 中有一个表单,它提交类别 ID 等值。在将报告保存到数据库之前,我需要做的是向该类别 ID 的电子邮件地址发送邮件。

这是我的views.py

class ManageCategories(viewsets.ModelViewSet):
    serializer_class = CategorySerializer

    def get_object(self, queryset=None, **kwargs):
        item = self.kwargs.get('pk')
        return get_object_or_404(Category, slug=item)

    def get_queryset(self):        
        return Category.objects.all()


class ManageReports(viewsets.ModelViewSet):
    serializer_class = ReportSerializer
    parser_classes = [MultiPartParser, FormParser]

    def get_permissions(self):
        if self.action == 'create':
            self.permission_classes = [permissions.AllowAny]
        else:
            self.permission_classes = [permissions.IsAuthenticated]
        return super(self.__class__, self).get_permissions()


    def create(self, request, *args, **kwargs):
        serializer = ReportSerializer(data=request.data)
        
        if serializer.is_valid():
            data = serializer.validated_data         

            try:
                serializer.save()
                return Response({"success": "Sent"})
            except Exception as ex:
                return Response({'success': f'{ex}'})
            
        return Response({"success": serializer.errors})


    def get_object(self, queryset=None, **kwargs):
        id = self.kwargs.get('pk')
        return get_object_or_404(Report, id=id)


    def get_queryset(self):        
        return Report.objects.all()

如何从提交的类别ID开始获取email值?

【问题讨论】:

  • 怎么样:serializer.validated_data,它存储了调用.is_valid()之后的所有验证数据。另外,可能是serializer.initial_data,它存储了调用.si_valid之前的所有初始数据。
  • 尝试:serializer.validated_data["category"].email,确保在调用serializer.is_valid()之后。
  • @MahrusKhomani serializer.validated_data["category"].email 有效!非常感谢!如果您愿意,请将您的评论作为答案发布,以便我标记它!
  • 刚刚作为答案发布,谢谢。

标签: django django-rest-framework django-views django-serializer django-validation


【解决方案1】:

我们可以从序列化器中获取所有经过验证的数据,如下所示:

serializer.validated_data["category"].email

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2018-07-31
    • 1970-01-01
    • 2023-03-30
    • 2022-08-08
    • 2014-09-08
    相关资源
    最近更新 更多