Tôi biết chủ đề này đã là câu trả lời nhưng tôi bắt đầu làm việc để giải quyết vấn đề này và vì bài đăng này là một trong những nguồn cảm hứng của tôi, tôi muốn chia sẻ giải pháp cuối cùng của mình. Nó có thể hữu ích cho ai đó.Tôi có các mô hình, vì vậy các tầng lớp phụ huynh:
#parent model class
class Parent(models.Model):
id = models.AutoField(primary_key=True)
field = models.CharField(max_length=45)
class Meta:
managed = False
db_table = 'parent'
sau đó, lớp trẻ:
#child model class
class Child(models.Model):
id = models.AutoField(primary_key=True)
field = models.CharField(max_length=45)
parent = models.ForeignKey(Parent, related_name='children')
class Meta:
managed = False
db_table = 'child'
tôi phải xác định serializers, vì tôi không muốn tạo ra một router url thể truy cập đến trực tiếp quản lý đối tượng trẻ em, nhưng tôi muốn tạo ra chúng thông qua ModelViewSet của phụ huynh ModelViewSet, đây là những gì tôi cần:
class ChildSerializer(serializers.ModelSerializer):
class Meta:
model = Child
read_only_fields = ('id',)
class ParentSerializer(serializers.ModelSerializer):
class Meta:
model = Banner
read_only_fields = ('id',)
class ParentSerializerNested(ParentSerializer):
children = ChildSerializer(many=True)
tôi lúc đó đã sẵn sàng để tạo ra các ModelViewSet, trọng/cũ chăm sóc các tạo/cập nhật mixins, và làm cho nó chung chung để tái sử dụng nó cho các trường hợp khác:
class ParentChildViewSet(viewsets.ModelViewSet):
def create(self, request, *args, **kwargs):
serializer = self.serializer_parent(data=request.DATA,
files=request.FILES)
try:
if serializer.is_valid():
with transaction.commit_on_success():
self.pre_save(serializer.object)
parent = serializer.save(force_insert=True)
self.post_save(parent, created=True)
# need to insert children records
for child in request.DATA[self.child_field]:
child[self.parent_field] = parent.id
child_record = self.serializer_child(data=child)
if child_record.is_valid():
child_record.save(force_insert=True)
else:
raise ValidationError('Child validation failed')
headers = self.get_success_headers(serializer.data)
serializer.data[self.child_field] = self.serializer_child(
self.model_child.objects.filter(
**{self.parent_field: parent.id}).all(),
many=True).data
return Response(serializer.data,
status=status.HTTP_201_CREATED,
headers=headers)
except ValidationError:
pass
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Vì vậy, tôi có thể tái sử dụng nó cho mọi trường hợp mối quan hệ lồng nhau tôi có trong ứng dụng của tôi như thế này:
class ParentViewSet(ParentChildViewSet):
child_field = 'children'
parent_field = 'parent'
model = Parent
model_child = Child
serializer_class = ParentSerializerNested
serializer_parent = ParentSerializer
serializer_child = ChildSerializer
Và cuối cùng, routing:
router = routers.DefaultRouter()
router.register(r'parents', ParentViewSet)
Nó hoạt động như một nét duyên dáng!
Aha, đó là những gì tôi đang tìm kiếm. Rất cám ơn, câu trả lời đã được chấp nhận. – gozzilli