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

我有4个相关的模型,我需要实现该功能,以便在一个帖子查询中在数据库中一致地创建这些模型的实例。为此,我使用 APIView 类 post 方法的重写。


模型


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


class VendorsSerializer(serializers.ModelSerializer):

    class Meta:

        model = Vendors

        fields = ('vendor_name',

                  'country',

                  'nda',)

保存一个供应商模型没有问题,但我无法想象如何在单个请求中保存所有相关模型的级联。


弑天下
浏览 93回答 1
1回答

青春有我

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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python