Invalid `self.instance` when validating the serializer using `many=True`
I maintainer di solito rispondono entro 1 giorno
@zainnadeem786 ci sta già lavorando.
Dal 25/1/2026.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 42/100
Direzione di ricerca
La issue non indica file di implementazione né test; inizia tracciando la validazione del serializer attraverso il percorso many=True di ListSerializer e il modo in cui ogni child riceve la propria instance durante la validazione parziale. Il lavoro è completato quando la validazione bulk usa l’oggetto corrispondente per self.instance, mantiene il comportamento della singola instance e restituisce gli errori per elemento mostrati nell’esempio.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Currently 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
This is the simplest example to understand:
from django.db import models
from rest_framework import serializers
class MyClass(models.Model):
name = models.CharField(max_length=100)
status = models.CharField(max_length=100, blank=True)
@property
def is_valid(self):
return self.name == 'valid'
class MyClassSerializer(serializers.ModelSerializer):
class Meta:
model = MyClass
fields = ('id', 'name', 'status')
def validate_status(self, value):
if value and not self.instance.is_valid:
raise serializers.ValidationError('Status cannot be set for invalid instance')
return value
objs = MyClass.objects.bulk_create(
objs=[
MyClass(name='valid'),
MyClass(name='invalid'),
MyClass(name='other'),
]
)
serializer = MyClassSerializer(
data=[{'status': 'set', 'id': instance.id} for instance in objs],
instance=objs,
many=True,
partial=True,
)
serializer.is_valid()
print(serializer.errors)
Please 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)
The following exception raised:
AttributeError: 'list' object has no attribute 'is_valid'
When expected behavior would be to get this one (pretty-printed):
[
{},
{'status': [ErrorDetail(string='Status cannot be set for invalid instance', code='invalid')]},
{'status': [ErrorDetail(string='Status cannot be set for invalid instance', code='invalid')]},
]
P.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.
P.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?
- Lingua principale
- Python
- Stelle
- 30.2k
- Fork
- 7.1k
- Merge medio
- 1g 20h
- PR unite (30g)
- 19
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di encode/django-rest-framework
-
Documentation
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
encode/django-rest-framework#3460 · 37 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
a viewset's action list gets "head" added to it, but only after being called at least onceForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 48/100
encode/django-rest-framework#9747 · 8 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Performance issue: N+1 queries and slow validation when using many=True with serializers containing relational fieldsForse già presa @adelkhayata76 l’ha presa 122 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 25/100
encode/django-rest-framework#9607 · 14 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
BookListSerializer example for create case is still flawedForse già presa @AyushDharDubey l’ha presa 646 giorni fa. Apertastale
Difficoltà 2/5 1-3 ore Idoneità per principianti 48/100
encode/django-rest-framework#9469 · 4 commenti · 2 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
Not possible to override serializer_field_mappings with a field that has choices (for example a from ChoiceField derived field)Forse già presa @G-Glitch404 l’ha presa 10 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 65/100
encode/django-rest-framework#9179 · 9 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di encode/django-rest-framework
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
sierra-research/tau2-bench#635 ·
I maintainer di solito rispondono entro 1 giorno
-
The add-ssm-model skill requires a Cython simulator; the contributing guide allows Python onesForse già presa @fmuia l’ha presa oggi. Apertadocumentation skill
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
lnccbrown/ssm-simulators#406 ·
I maintainer di solito rispondono entro 4 giorni
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 95/100
btclib-org/btclib-ecc#309 ·
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
jbacalso24/mimry#459 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug] POST /revoke with a FastMCP access token is a silent no-op (ownership gate never matches)Apertaauth bug high-priority
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno