【问题标题】:DRF 3.0: Sharing a single UniqueTogetherValidator among related Serializers with Django Rest FrameworkDRF 3.0:使用 Django Rest 框架在相关序列化程序之间共享单个 UniqueTogetherValidator
【发布时间】:2015-12-18 08:51:42
【问题描述】:

我正在处理一组通过继承共享一些公共属性的模型类:

class MyBaseModel(models.Model):

    class Meta:
        abstract = True
        unique_together = (('system', 'code',),)

    id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True, ...
    system = models.ForeignKey(System, ...
    code = models.CharField(...
    ...


class ModelA(MyBaseModel):
    ...

class ModelB(MyBaseModel):
    ...

请注意 Meta 类中存在 unique_together 约束。

类似的层次结构对于相应的序列化程序会很方便; 我不确定是否需要明确指定 UniqueTogetherValidator, 目前正在对此进行调查。 但是以防万一,我想知道如何在基本序列化程序类中表达它,因为它 需要一个事先不知道的查询集:

from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator


class MyBaseModelSerializer(serializers.ModelSerializer):

    class Meta:
        exclude = ['date_created', 'created_by', ...

        validators = [
            UniqueTogetherValidator(
                queryset=???.objects.all(),
                fields=('system', 'code')
            )
        ]


class ModelASerializer(MyBaseModelSerializer):
    class Meta(MyBaseModelSerializer.Meta):
        model = ModelA
    ...


class ModelBSerializer(MyBaseModelSerializer):
    class Meta(MyBaseModelSerializer.Meta):
        model = ModelB
    ...

如何避免对每个派生类重复它,如下所示 例子?

from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator


class MyBaseModelSerializer(serializers.ModelSerializer):

    class Meta:
        exclude = ['date_created', 'created_by', ...


class ModelASerializer(MyBaseModelSerializer):
    class Meta(MyBaseModelSerializer.Meta):
        model = ModelA
        validators = [
            UniqueTogetherValidator(
                queryset=ModelA.objects.all(),
                fields=('system', 'code')
            )
        ]
    ...


class ModelBSerializer(MyBaseModelSerializer):
    class Meta(MyBaseModelSerializer.Meta):
        model = ModelB
        validators = [
            UniqueTogetherValidator(
                queryset=ModelB.objects.all(),
                fields=('system', 'code')
            )
        ]
    ...

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    模型序列化程序从模型的 unique_together 约束中添加 UniqueTogetherValidator。你没有单独给。

    【讨论】:

    • 谢谢;你是完全正确的:UniqueTogetherValidator 来自 Model unique_together 约束是免费的。但是,问题仍然存在:如果可能,我如何通过继承在序列化程序之间共享自定义 UniqueTogetherValidator?
    【解决方案2】:

    需要覆盖

    unique_together = (('system', 'code',),)
    

    在非抽象模型中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-19
      • 2018-06-18
      • 2022-01-08
      • 2015-02-25
      • 1970-01-01
      • 2018-07-11
      • 2020-10-26
      • 2017-10-03
      相关资源
      最近更新 更多