相关疑难解决方法(0)

在Django Rest Framework中,如何添加ManyToMany相关对象?

这是我的代码:

楷模

class Recipe(models.Model):
  name = models.CharField(max_length=50, unique=True)
  ingredient = models.ManyToManyField(Ingredient)

class Ingredient(models.Model):
  name = models.CharField(max_length=50, unique=True)
Run Code Online (Sandbox Code Playgroud)

看法

class RecipeDetailAPIView(RetrieveUpdateDestroyAPIView):
  permission_classes = (IsAdminOrReadOnly,)
  serializer_class = RecipeSerializer
  queryset = Recipe.objects.all()

  def put(self, request, *args, **kwargs):
    return self.update(request, *args, **kwargs)

  def perform_update(self, serializer):
    serializer.save(updated_by_user=self.request.user)
Run Code Online (Sandbox Code Playgroud)

序列化器

class IngredientSerializer(serializers.ModelSerializer):

    class Meta:
        model = Ingredient
        fields = [
      'id',
            'name',
        ]

class RecipeSerializer(serializers.ModelSerializer):
  ingredient = IngredientSerializer(many=True, read_only=False)

  class Meta:
    model = Recipe
    fields = [
      'id',
      'name',
      'ingredient',
    ]
Run Code Online (Sandbox Code Playgroud)

我从以下 Recipe 对象开始:

{
    "id": 91 …
Run Code Online (Sandbox Code Playgroud)

django-rest-framework

6
推荐指数
1
解决办法
3986
查看次数

DRF:在创建时验证嵌套的序列化程序数据,但在更新时不验证

在DRF中使用可写嵌套序列化程序时,验证最终唯一字段并阻止更新父序列化程序存在已知问题.在这样的问题中已多次询问此问题:

  1. 关于Django Rest Framework上嵌套序列化器的唯一验证
  2. Django休息框架没有使用FK创建具有unique = True字段的模型的对象

为简单起见,我们以第一个问题为例:

class GenreSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('name',) #This field is unique
        model = Genre
        extra_kwargs = {
            'name': {'validators': []},
        }

class BookSerializer(serializers.ModelSerializer):
    genre = GenreSerializer()

    class Meta:
        model = Book
        fields = ('name', 'genre')

    def create(self, validated_data):
        # implement creating

    def update(self, instance, validated_data):
        # implement updating
Run Code Online (Sandbox Code Playgroud)

现在问题是,唯一性验证也被删除以用于创建.这可以在视图中截获,例如:

class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer = BookSerializer

    def perform_create(self):
        # implement logic and raise ValidationError
Run Code Online (Sandbox Code Playgroud)

然而,这感觉不太对,因为我们正在验证Genrein 的唯一性BookViewSet.

另一种选择是在第二个问题中解释的 …

python django django-rest-framework

2
推荐指数
1
解决办法
3857
查看次数

标签 统计

django-rest-framework ×2

django ×1

python ×1