Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django序列化程序、嵌套关系和get_或_create_Python_Django_Django Models_Django Serializer_Serialization - Fatal编程技术网

Python Django序列化程序、嵌套关系和get_或_create

Python Django序列化程序、嵌套关系和get_或_create,python,django,django-models,django-serializer,serialization,Python,Django,Django Models,Django Serializer,Serialization,我已经在这个问题上纠缠了一段时间了。我有两个模型:采集和原始数据 每个原始数据都有一次采集,但许多原始数据可以有相同的采集 我希望在创建RawData时自动创建或获取Acquisition实例。我希望能够使用序列化程序获得所有信息 class Acquisitions(models.Model): class Meta: unique_together = (('implant', 'beg_acq', 'duration_acq'),) id = models

我已经在这个问题上纠缠了一段时间了。我有两个模型:采集和原始数据

每个原始数据都有一次采集,但许多原始数据可以有相同的采集

我希望在创建RawData时自动创建或获取Acquisition实例。我希望能够使用序列化程序获得所有信息

class Acquisitions(models.Model):
    class Meta:
        unique_together = (('implant', 'beg_acq', 'duration_acq'),)

    id = models.AutoField(primary_key=True)
    implant = models.ForeignKey("Patients", on_delete=models.CASCADE)
    beg_acq = models.DateTimeField("Beggining date of the acquisition")
    duration_acq = models.DurationField("Duration of the acquisition")

class RawDatas(models.Model):
    class Meta:
    unique_together = (('acq', 'data_type'),)

    id = models.AutoField(primary_key=True)
    acq = models.ForeignKey("Acquisitions", on_delete=models.CASCADE)
    data_type = models.CharField(max_length=3)
    sampling_freq = models.PositiveIntegerField("Sampling frequency")
    bin_file = models.FileField(db_index=True, upload_to='media')
我的序列化程序如下所示:

class AcquisitionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Acquisitions
        fields = ('id', 'implant', 'beg_acq', 'duration_acq')

class RawDatasSerializer(serializers.ModelSerializer):
    acq = AcquisitionSerializer()

    class Meta:
        model = RawDatas
        fields = ('id', 'data_type', 'sampling_freq', 'bin_file', 'acq')

    def create(self, validated_data):
        acq_data = validated_data.pop('acq')
        acq = Acquisitions.objects.get_or_create(**acq_data)
        RawDatas.objects.create(acq=acq[0], **validated_data)
        return rawdatas
我的问题是,使用这个,如果我的采集实例已经存在,我会得到一个非字段错误或另一个约束验证错误

我想知道正确的处理方法是什么

因此,我可以使用嵌套序列化程序自动创建它,并且当我只想获得信息(例如GET请求)时,我可以拥有我需要的所有字段(两个模型的每个字段)

提前感谢您的帮助

试试这个:

class AcquisitionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Acquisitions
        fields = ('id', 'implant', 'beg_acq', 'duration_acq')

class RawDatasSerializer(serializers.ModelSerializer):
    class Meta:
        model = RawDatas
        fields = ('id', 'data_type', 'sampling_freq', 'bin_file', 'acq')

    def create(self, validated_data):
        acq_data = validated_data.pop('acq')
        acq = Acquisitions.objects.filter(id=acq_data.get('id')).first()

        if not acq:
            acq = AcquisitionSerializer.create(AcquisitionSerializer(), **acq_data)

        rawdata = RawDatas.objects.create(acq=acq, **validated_data)

        return rawdata

很好,它可以工作,谢谢,但是因为不再有AcquisitionSerializer,当我尝试获取信息时,我只获取acq编号,而不是像以前那样获取所有的信息,我应该删除什么函数来获取这些信息?只需将此添加到您的
RawDataSerializer
acq=AcquisitionSerializer()
就在
类元之前
。是的,它适用于get请求,但我得到了:{'acq':{'non_field_errors':[ErrorDetail(string='the fields implant,beg_acq,duration'u acq must make a unique set.',code='unique')]}当尝试使用现有采集添加新数据时。这与您的模型设计有关。您正在一起创建可能不需要的
unique\u
约束。是的,我需要此约束以确保我不能有两个具有相同持续时间/植入/开始时间的采集。