简体   繁体   English

如何在一个 DRF 端点中保存三个相关模型?

[英]How to save three related models in one DRF endpoint?

I have 4 related models and I need to implement the functionality to consistently create instances of these models in a database in one post query.我有 4 个相关模型,我需要实现功能以在一次后查询中在数据库中一致地创建这些模型的实例。 For this I use override of the APIView class post method.为此,我使用 APIView 类 post 方法的覆盖。

models楷模

class VendorContacts(models.Model):
    contact_id = models.AutoField(primary_key=True)
    vendor = models.OneToOneField('Vendors', on_delete=models.CASCADE)
    contact_name = models.CharField(max_length=45, blank=True)
    phone = models.CharField(max_length=45, blank=True)
    email = models.CharField(max_length=80, blank=True, unique=True)

    class Meta:
        db_table = 'vendor_contacts'


class VendorModuleNames(models.Model):
    vendor = models.OneToOneField('Vendors', on_delete=models.CASCADE, primary_key=True)
    module = models.ForeignKey(Modules, models.DO_NOTHING)
    timestamp = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'vendor_module_names'
        unique_together = (('vendor', 'module'),)


class Vendors(models.Model):
    COUNTRY_CHOICES = tuple(COUNTRIES)

    vendorid = models.AutoField(primary_key=True)
    vendor_name = models.CharField(max_length=45, unique=True)
    country = models.CharField(max_length=45, choices=COUNTRY_CHOICES)
    nda = models.DateField(blank=True, null=True)
    user_id = models.ForeignKey('c_users.CustomUser', on_delete=models.PROTECT)
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'vendors'
        unique_together = (('vendorid', 'timestamp'),)

class Modules(models.Model):
    MODULES_NAME =tuple(MODULES)
    mid = models.AutoField(primary_key=True)
    module_name = models.CharField(max_length=50, choices=MODULES_NAME)
    active = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now=True)

    class Meta:
        db_table = 'modules'
        unique_together = (('mid', 'timestamp'),)

serializer.py序列化程序.py

class VendorsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Vendors
        fields = ('vendor_name',
                  'country',
                  'nda',)


class VendorContactSerializer(serializers.ModelSerializer):
    class Meta:
        model = VendorContacts
        fields = (
                  'contact_name',
                  'phone',
                  'email',)


class VendorModulSerializer(serializers.ModelSerializer):
    class Meta:
        model = VendorModuleNames
        fields = ('module',)


class ModulesSerializer(serializers.ModelSerializer):
    class Meta:
        model = Modules
        fields = ('module_name', )

views.py视图.py

class VendorsCreateView(APIView):
    """Create new vendor instances from form"""

    def post(self, request, *args, **kwargs):
        vendor_serializer = VendorsSerializer(data=request.data)
        vendor_contact_serializer = VendorContactSerializer(data=request.data)
        vendor_modules_serializer = VendorModulSerializer(data=request.data)
        module_serializer = ModulesSerializer(data=request.data)
        try:
            vendor_serializer.is_valid(raise_exception=True) \
                and vendor_contact_serializer.is_valid(raise_exception=True) \
                and vendor_modules_serializer.is_valid(raise_exception=True) \
                and module_serializer.is_valid(raise_exception=True)
            vendor_serializer.save(user_id=request.user)
            # ....
            # Some new logic here ????
            # ...
        except ValidationError:
            return Response({"errors": (vendor_serializer.errors,
                                        vendor_contact_serializer.errors,
                                        vendor_modules_serializer.errors
                                        )},
                            status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(request.data, status=status.HTTP_200_OK)

There is no problem saving one Vendor model, but I can't imagine how to save cascading all related models in a single request.保存一个 Vendor 模型没有问题,但我无法想象如何在单个请求中保存级联所有相关模型。

save returns the newly saved object, which you can then pass into the subsequent save() methods: save返回新保存的对象,然后您可以将其传递给后续的save()方法:

vendor = vendor_serializer.save(user_id=request.user)
module = module_serializer.save()
vendor_module = vendor_modules_serializer.save(module=module, vendor=vendor)
vendor_contact = vendor_contact_serializer.save(vendor=vendor)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM