![](/img/trans.png)
[英]Django DRF nested relationships - how to add objects in a ManyToMany field
[英]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"
}
ThreadListCreate
重命名為ThreadListCreateViewSet
(更具可讀性),也許您可以改用ModelSerailizer
,因為它擁有您需要的一切我會做類似的事情
視圖集
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.