如何使此序列化器正确显示?

时间:2018-09-10 12:13:03

标签: django

Django给了我这个错误。我尝试过的解决方案似乎无效。要求我将此作为药物治疗的实例...我还没有这样做吗?我正在尝试在一个careLogSerializer下使用两个序列化程序cat和药物。那有可能吗?我该如何最好地解决此错误?

builtins.ValueError
ValueError: Cannot assign "OrderedDict([('name', 'carelog3'), ('duration', 'short'), ('frequency', '4')])": "CareLog.medication" must be a "Medication" instance.

这是我的序列化器。...

class CareLogSerializer(serializers.HyperlinkedModelSerializer):
    cat = CatSerializer()
    medication = MedicationSerializer()
    # cat = CatSerializer(read_only=True) this allows put BUT TURNS OFF POST

    class Meta:
        model = CareLog
        fields = (
            'cat',
            'slug',
            'foster_manager',
            'weight_unit_measure',
            'weight_before_food',
            'food_unit_measure',
            'amount_of_food_taken',
            'food_type',
            'weight_after_food',
            'stimulated',
            'medication',
            'medication_dosage_given',
            'medication_dosage_unit',
            'notes',
            'created',
            'photo',
        )
        extra_kwargs = {
            'foster_manager': {
                'read_only': True,
                'required': False,
                'lookup_field': 'id',
            },
            'medication': {
                'read_only': True,
                'required': False,
                'lookup_field': 'slug',
            },
            'cat': {
              'read_only': True,
              'required': False,
              'lookup_field': 'slug',
            },
        }

    @staticmethod
    def create(validated_data):
        cat_data = validated_data.pop('cat')
        cat_obj = Cat.objects.get(**cat_data)
        return CareLog.objects.create(cat=cat_obj, **validated_data)

    @staticmethod
    def update(instance, validated_data):
        instance.weight_unit_measure = validated_data['weight_unit_measure']
        instance.weight_before_food = validated_data['weight_before_food']
        instance.food_unit_measure = validated_data['food_unit_measure']
        instance.amount_of_food_taken = validated_data['amount_of_food_taken']
        instance.food_type = validated_data['food_type']
        instance.weight_after_food = validated_data['weight_after_food']
        instance.stimulated = validated_data['stimulated']
        instance.stimulation_type = validated_data['stimulation_type']
        instance.notes = validated_data['notes']
        instance.save()

这是我的模特

class CareLog(models.Model):
    WEIGHT_MEASURE_CHOICES = (
        ('OZ', '(oz) Ounces'),
        ('LB', '(lb) Pounds'),
        ('G', '(G) Grams')
    )
    OUNCES = 'OZ'
    POUNDS = 'LB'
    GRAMS = 'G'

    VOLUME_MEASURE_CHOICES = (
        ('ML', '(ml) Milliliters'),
        ('CC', '(cc) Cubic Centimeters'),
        ('OZ', '(oz) Ounces'),
        ('G', '(G) Grams')
    )
    MILLILITERS = 'ML'
    CUBIC_CENTIMETERS = 'CC'

    FOOD_TYPE_CHOICES = (
        ('MN', 'Mom (Nursing)'),
        ('BO', 'Bottle'),
        ('BS', 'Bottle / Syringe'),
        ('SG', 'Syringe Gruel'),
        ('GG', 'Syringe Gruel / Gruel'),
        ('G',  'Gruel')
    )
    BOTTLE = 'BO'
    BOTTLE_SYRINGE = 'BS'
    SYRINGE_GRUEL = 'SG'
    SYRINGE_GRUEL_GRUEL = 'GG'
    GRUEL = 'G'

    STIMULATION_CHOICES = (
        ('UR', 'Urine'),
        ('FE', 'Feces'),
        ('UF', 'Urine / Feces'),
    )
    URINE = 'UR'
    FECES = 'FE'
    URINE_FECES = 'UF'

    cat = models.ForeignKey(Cat)
    slug = AutoSlugField(max_length=255, unique=True, blank=True, null=True)

    foster_manager = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)

    weight_unit_measure = models.CharField(max_length=2, choices=WEIGHT_MEASURE_CHOICES, default=GRAMS)
    weight_before_food = models.IntegerField(blank=True, null=True)
    food_unit_measure = models.CharField(max_length=2, choices=WEIGHT_MEASURE_CHOICES, default=GRAMS)
    amount_of_food_taken = models.IntegerField(blank=True, null=True)
    food_type = models.CharField(max_length=2, choices=FOOD_TYPE_CHOICES, blank=True, null=True)
    weight_after_food = models.IntegerField(blank=True, null=True)

    stimulated = models.BooleanField(default=False)
    stimulation_type = models.CharField(max_length=2, choices=STIMULATION_CHOICES, blank=True, null=True)

    medication = models.ForeignKey(Medication, blank=True, null=True)
    medication_dosage_given = models.FloatField(blank=True, null=True)
    medication_dosage_unit = models.CharField(max_length=2, choices=VOLUME_MEASURE_CHOICES, blank=True, null=True,
                                              help_text="If left blank this will default to "
                                                        "the default unit for the medication.")

    notes = models.TextField(blank=True, null=True)

    created = models.DateTimeField(auto_now_add=True)

    photo = models.FileField(upload_to="kitty_photos", blank=True, null=True)

    def save(self, *args, **kwargs):
        # Update Cat's weight if 'Weight After Food' is updated
        if self.weight_after_food:
            self.cat.weight = self.weight_after_food
            self.cat.save()

            # Get all previous cat feedings
            feedings = CareLog.objects.filter(cat=self.cat).order_by('-id')
            if feedings:
                # if the list of cat feedings contains the current, get rid of current from the list
                if feedings[0] == self:
                    feedings = feedings[1:]

                # TODO You broke it you fix it:
                # If the feeding is a weight loss log it as the first/second/third
                if self.weight_after_food < feedings[0].weight_after_food:
                    if self.cat.first_weight_loss:
                        self.cat.second_weight_loss = True
                    elif self.cat.second_weight_loss:
                        self.cat.third_weight_loss = True
                    elif self.cat.third_weight_loss:
                        self.cat.many_weight_losses = True
                    elif not self.cat.first_weight_loss:
                        self.cat.first_weight_loss = True

                # Save Cat Object
                self.cat.save()

        if self.medication and not self.medication_dosage_unit:
            self.medication_dosage_unit = self.medication.dosage_unit

        super(CareLog, self).save(*args, **kwargs)

    def __str__(self):
        return "{cat}: {timestamp}".format(cat=self.cat.name, timestamp=self.created)

1 个答案:

答案 0 :(得分:0)

在您的... let c = [] for (b = 1; b <= 3; b++) { c.push(a + b) } allNumbers.push(c) ... 方法中,您需要对create进行与medication相同的操作。首先创建对象并将其分配给CareLog:

cat

否则,Django会尝试将其设置为外键的值dict对象并引发错误。