簡體   English   中英

使用 DRF 將嵌套對象保存到 ManyToMany 字段

[英]Save nested objects to ManyToMany field with DRF

Model:

class Thread(models.Model):
"""Thread model for messages."""

    participants = models.ManyToManyField(to=User, verbose_name=_("Participants"))
    created_at = models.DateTimeField(auto_now_add=True, verbose_name=_("Created"))
    updated_at = models.DateTimeField(auto_now=True, verbose_name=_("Updated"))

我有這個序列化程序:

class UserSerializer(serializers.ModelSerializer):
"""Serialize User model to get data from ManyToMany field to use in Thread participants."""

class Meta:
    model = User
    fields = ("id", "email")


class ThreadSerializer(serializers.ModelSerializer):
"""Serializer for create, get, edit, delete Thread."""

participants = UserSerializer(read_only=True, many=True)

class Meta:
    model = Thread
    fields = ("id", "participants", "created_at", "updated_at")

和意見:

class ThreadListCreate(generics.ListCreateAPIView):
"""
Get threads list with participants details.
Creates a new thread with two participants.
"""
    permission_classes = (AllowAny,)
    queryset = Thread.objects.all()
    serializer_class = ThreadSerializer

我需要在“參與者”中創建兩個用戶的新線程,我該怎么做? 此外,要將新用戶分配給“參與者”,我只需要輸入“id”,如下代碼所示:

{
"participants": [
    {"id": 1},
    {"id": 4}
    ]
}

現在,由於上面的 POST 代碼,我得到了這個:

{
"id": 28,
"participants": [],
"created_at": "2022-02-16T18:22:17.524911Z",
"updated_at": "2022-02-16T18:22:17.524911Z"
}
  1. 也許您想將視圖集從ThreadListCreate重命名為ThreadListCreateViewSet (更具可讀性),也許您可以改用ModelSerailizer ,因為它擁有您需要的一切
  2. 最好只拆分序列化程序(一個僅用於創建目的)

我會做類似的事情

視圖集

class ThreadListCreateViewSet(ModelViewset):
    permission_classes = (AllowAny,)
    queryset = Thread.objects.all()
    serializer_class = ThreadSerializer
    create_serializer_class = CreateThreadSerializer

    def get_serializer_class(self):
        if self.action == "create":
            return self.create_serilaizer_class
        return self.serializer_class

串行器

class CreateThreadSerializer(serializers.ModelSerializer):
    participants = UserSerializer(many=True)

    def create(self, validated_data):
        instance = Thread.objects.create()
        for user in validated_data["participants"]:
            instance.participants.add(user)
        instance.save()
        return instance

這就是我要做的......希望它對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM