Django 通过DRF中的一个post请求创建互连模型的多个模型实例

Django 通过DRF中的一个post请求创建互连模型的多个模型实例,django,post,django-models,django-rest-framework,serialization,Django,Post,Django Models,Django Rest Framework,Serialization,我想从一个post请求中创建两个条目。一个在“日期”模型中,另一个在“其他”模型中。两种型号对应的代码如下所示 class Dates(models.Model): booking_id = models.AutoField(primary_key=True) timestamp = models.DateTimeField(auto_now_add=True) feedback = models.CharField(max_length=8, default='no') mys

我想从一个post请求中创建两个条目。一个在“日期”模型中,另一个在“其他”模型中。两种型号对应的代码如下所示

class Dates(models.Model):
  booking_id = models.AutoField(primary_key=True)
  timestamp = models.DateTimeField(auto_now_add=True)
  feedback = models.CharField(max_length=8, default='no')
  myself = models.BooleanField(default=True)

  class Meta:
    app_label = 'bookings'
另一个是:

class Other(models.Model):
  booking_id = models.OneToOneField(
                'bookings.Dates',
                null=False,
                default=1,
                primary_key=True,
                on_delete=models.CASCADE
            )
  name = models.CharField(max_length=64)
  phone_number = models.CharField(max_length=14)
  email_id = models.EmailField(max_length=128)

  class Meta:
    app_label = 'bookings'
我已经验证了日期序列化程序中的数据,并在“Dates”表中创建了对象。现在,我想使用生成的“booking\u id”作为“Other”表的相同“booking\u id”。如何验证序列化程序并在“Other”表中创建对象,同时保持一致性?
这里的一致性是指:如果没有发生错误,则在两个表中创建对象;如果发生错误,则不创建对象。

您可以使用可写嵌套序列化程序来实现这一点。您需要为其他模型定义序列化程序类,然后日期序列化程序可以如下所示:

class DatesSerializer(serializers.ModelSerializer):
    other = OtherSerializer()

    class Meta:
        model = Dates
        fields = ('timestamp', 'feedback', 'myself', 'other')

    def validate_other(self, value):
        # Run validations for Other model here, either manually or through OtherSerializer's is_valid method. You won't have booking_id in value here though, take that into account when modelling your validation process

    def validate_feedback(self, value):
        # Run validations specific to feedback field here, if necessary. You can do this for all serializer fields

    def validate(self, data):
        # Run non-field specific validations for Dates here

    def create(self, validated_data):
        # At this point, validation for both models are run and passed

        # Pop other model data from validated_data first
        other_data = validated_data.pop('other')

        # Create Dates instance 
        dates = Dates.objects.create(**validated_data)

        # Create Other instance now
        Other.objects.create(booking_id=dates, **other_data)

        return dates

您可以在这里使用DRF的defaul CreateModelMixin,所有嵌套对象逻辑都在序列化程序中处理。

您需要的是可写的嵌套序列化程序:实际上,我是DRF的新手。你能告诉我如何为序列化程序和视图编写代码吗?你能告诉我OtherSerializer()是否包含所有字段或除booking_id之外的所有字段吗?在这个setp中,除booking_id之外的所有字段我都没有编写验证其他(validate_other)的代码,但它仍在工作。它是否会在将来产生问题?一个可能的问题是,如果在“其他”请求中缺少提供的数据,您最终可能会创建一个Dates实例,但不会为其创建关联的其他指令,因为Other.objects.create(booking_id=Dates,**Other_data)将失败。另一个可能的问题是,在其他情况下,您可能会得到无效的数据(例如,无效的电话号码)