{
  "appeals": 1,
  "budgets": {
    "baseline_limit_s": 600,
    "verification_timeout_s": 600,
    "worker": {
      "max_completion_tokens": 96000,
      "max_turns": 60,
      "max_wall_seconds": 1500.0,
      "prompt_token_budget": 160000
    }
  },
  "issue": "Invalid `self.instance` when validating the serializer using `many=True`\nCurrently it is almost impossible to use the same serializer with and without `many=True` and the problem that sometimes serializer depending on the instance state or value during serialization and validation (usually it is PATCH method and `partial=True`\r\n\r\nThis is the simplest example to understand:\r\n```python\r\nfrom django.db import models\r\nfrom rest_framework import serializers\r\n\r\n\r\nclass MyClass(models.Model):\r\n    name = models.CharField(max_length=100)\r\n    status = models.CharField(max_length=100, blank=True)\r\n\r\n    @property\r\n    def is_valid(self):\r\n        return self.name == 'valid'\r\n\r\n\r\nclass MyClassSerializer(serializers.ModelSerializer):\r\n    class Meta:\r\n        model = MyClass\r\n        fields = ('id', 'name', 'status')\r\n\r\n    def validate_status(self, value):\r\n        if value and not self.instance.is_valid:\r\n            raise serializers.ValidationError('Status cannot be set for invalid instance')\r\n        return value\r\n\r\n\r\nobjs = MyClass.objects.bulk_create(\r\n    objs=[\r\n        MyClass(name='valid'),\r\n        MyClass(name='invalid'),\r\n        MyClass(name='other'),\r\n    ]\r\n)\r\n\r\nserializer = MyClassSerializer(\r\n    data=[{'status': 'set', 'id': instance.id} for instance in objs],\r\n    instance=objs,\r\n    many=True,\r\n    partial=True,\r\n)\r\nserializer.is_valid()\r\nprint(serializer.errors)\r\n```\r\n\r\nPlease note that it is just an example and real serializers and models can be much more complex. The case is working when we pass the single instance to the serializer but not working when we are trying to validate `bulk` operation, like update in bulk (let's say)\r\n\r\nThe following exception raised:\r\n```\r\nAttributeError: 'list' object has no attribute 'is_valid'\r\n```\r\n\r\nWhen expected behavior would be to get this one (pretty-printed):\r\n```\r\n[\r\n    {},\r\n    {'status': [ErrorDetail(string='Status cannot be set for invalid instance', code='invalid')]},\r\n    {'status': [ErrorDetail(string='Status cannot be set for invalid instance', code='invalid')]},\r\n]\r\n```\r\n\r\nP.S. I was able to manually patch the serializer to obtain the instance from the data provided, but I do not think that it should be done manually for every serializer. I assume that when we are validating the instance using PARTIAL, then the appropriate instance which is currently on validation, should be available inside the serializer. In this case we will be able to use the same serializer as single and multi entity-validation.\r\n\r\nP.P.S. Also I think that if user require some logic for the list of objects, it should be placed inside the overridden `list_serializer_class`, no?",
  "source": {
    "image": "docker.io/swerebenchv2/encode-django-rest-framework:8979-d252d22",
    "platform": "linux/amd64",
    "python": "python",
    "setup": [
      "python -c 'import base64; from pathlib import Path; Path('\"'\"'/tmp/receipts-encode__django-rest-framework-8979-test.patch'\"'\"').write_bytes(base64.b64decode('\"'\"'ZGlmZiAtLWdpdCBhL3Rlc3RzL3Rlc3Rfc2VyaWFsaXplci5weSBiL3Rlc3RzL3Rlc3Rfc2VyaWFsaXplci5weQppbmRleCAxMGZhOGFmYi4uMzlkOTIzOGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3Rlc3Rfc2VyaWFsaXplci5weQorKysgYi90ZXN0cy90ZXN0X3NlcmlhbGl6ZXIucHkKQEAgLTIsNiArMiw3IEBAIGltcG9ydCBpbnNwZWN0CiBpbXBvcnQgcGlja2xlCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAogZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ2hhaW5NYXAKIGZyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBNYXBwaW5nCiAKQEAgLTc4MywzICs3ODQsNjMgQEAgY2xhc3MgVGVzdFNldFZhbHVlTWV0aG9kOgogICAgICAgICByZXQgPSB7J2EnOiAxfQogICAgICAgICBzZWxmLnMuc2V0X3ZhbHVlKHJldCwgWyd4JywgJ3knXSwgMikKICAgICAgICAgYXNzZXJ0IHJldCA9PSB7J2EnOiAxLCAneCc6IHsneSc6IDJ9fQorCisKK2NsYXNzIE15Q2xhc3MobW9kZWxzLk1vZGVsKToKKyAgICBuYW1lID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTEwMCkKKyAgICB2YWx1ZSA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0xMDAsIGJsYW5rPVRydWUpCisKKyAgICBhcHBfbGFiZWwgPSAidGVzdCIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBpc192YWxpZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSA9PSAndmFsaWQnCisKKworY2xhc3MgTXlDbGFzc1NlcmlhbGl6ZXIoc2VyaWFsaXplcnMuTW9kZWxTZXJpYWxpemVyKToKKyAgICBjbGFzcyBNZXRhOgorICAgICAgICBtb2RlbCA9IE15Q2xhc3MKKyAgICAgICAgZmllbGRzID0gKCdpZCcsICduYW1lJywgJ3ZhbHVlJykKKworICAgIGRlZiB2YWxpZGF0ZV92YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIHZhbHVlIGFuZCBub3Qgc2VsZi5pbnN0YW5jZS5pc192YWxpZDoKKyAgICAgICAgICAgIHJhaXNlIHNlcmlhbGl6ZXJzLlZhbGlkYXRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAnU3RhdHVzIGNhbm5vdCBiZSBzZXQgZm9yIGludmFsaWQgaW5zdGFuY2UnKQorICAgICAgICByZXR1cm4gdmFsdWUKKworCitjbGFzcyBUZXN0TXVsdGlwbGVPYmplY3RzVmFsaWRhdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9ianMgPSBbCisgICAgICAgICAgICBNeUNsYXNzKG5hbWU9J3ZhbGlkJyksCisgICAgICAgICAgICBNeUNsYXNzKG5hbWU9J2ludmFsaWQnKSwKKyAgICAgICAgICAgIE15Q2xhc3MobmFtZT0nb3RoZXInKSwKKyAgICAgICAgXQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfb2JqZWN0c19hcmVfdmFsaWRhdGVkX3NlcGFyYXRlbHkoc2VsZik6CisKKyAgICAgICAgc2VyaWFsaXplciA9IE15Q2xhc3NTZXJpYWxpemVyKAorICAgICAgICAgICAgZGF0YT1beyd2YWx1ZSc6ICdzZXQnLCAnaWQnOiBpbnN0YW5jZS5pZH0gZm9yIGluc3RhbmNlIGluCisgICAgICAgICAgICAgICAgICBzZWxmLm9ianNdLAorICAgICAgICAgICAgaW5zdGFuY2U9c2VsZi5vYmpzLAorICAgICAgICAgICAgbWFueT1UcnVlLAorICAgICAgICAgICAgcGFydGlhbD1UcnVlLAorICAgICAgICApCisKKyAgICAgICAgYXNzZXJ0IG5vdCBzZXJpYWxpemVyLmlzX3ZhbGlkKCkKKyAgICAgICAgYXNzZXJ0IHNlcmlhbGl6ZXIuZXJyb3JzID09IFsKKyAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgeyd2YWx1ZSc6IFsnU3RhdHVzIGNhbm5vdCBiZSBzZXQgZm9yIGludmFsaWQgaW5zdGFuY2UnXX0sCisgICAgICAgICAgICB7J3ZhbHVlJzogWydTdGF0dXMgY2Fubm90IGJlIHNldCBmb3IgaW52YWxpZCBpbnN0YW5jZSddfQorICAgICAgICBdCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fcmFpc2VkX3doZW5fZGF0YV9hbmRfaW5zdGFuY2VfbGVuZ3RoX2RpZmZlcmVudChzZWxmKToKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIE15Q2xhc3NTZXJpYWxpemVyKAorICAgICAgICAgICAgICAgIGRhdGE9W3sndmFsdWUnOiAnc2V0JywgJ2lkJzogaW5zdGFuY2UuaWR9IGZvciBpbnN0YW5jZSBpbgorICAgICAgICAgICAgICAgICAgICAgIHNlbGYub2Jqc10sCisgICAgICAgICAgICAgICAgaW5zdGFuY2U9c2VsZi5vYmpzWzotMV0sCisgICAgICAgICAgICAgICAgbWFueT1UcnVlLAorICAgICAgICAgICAgICAgIHBhcnRpYWw9VHJ1ZSwKKyAgICAgICAgICAgICkK'\"'\"'))'",
      "git apply /tmp/receipts-encode__django-rest-framework-8979-test.patch"
    ],
    "workdir": "/django-rest-framework"
  },
  "spec_paths": [
    "tests/test_serializer.py"
  ],
  "spec_tests": [
    "tests/test_serializer.py::TestMultipleObjectsValidation::test_exception_raised_when_data_and_instance_length_different",
    "tests/test_serializer.py::TestMultipleObjectsValidation::test_multiple_objects_are_validated_separately"
  ],
  "suite_scope": "--no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning tests/test_serializer.py"
}
