-
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix unique together validator doesn't respect condition's fields #9360
base: master
Are you sure you want to change the base?
Conversation
rest_framework/serializers.py
Outdated
else: | ||
queryset = model._default_manager.filter(constraint.condition) | ||
condition_fields = [ | ||
f[0].split("__")[0] for f in constraint.condition.children |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not sure how reliable this method of fields extraction
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I duobt that this will work when the condition uses a cross-reference between two fields like: Q(first_field__gte=F('second_field'))
, however I dunno if an unique constraint like that makes sense.
I would like to see also a more complex condition like Q(fielda__isnull=True) | Q(fieldb=False)
to be addressed by this validator.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These case should be handled now
@kalekseev - Could you talk me through this? My understanding is that it's resolving an issue in #7438, is that correct? |
UPDATE: Yes, this pr is supposed to fix the initial implementation of UniqueConstraint support but at the moment it doesn't work. The problem is that DRF doesn't check if fields in data match the unique constraint condition or not, so for example constraint is:
we have record in db that should be unique
The data below should be valid because it has
but this should fail
|
fcc7c8d
to
472a323
Compare
Is there any movement on this? This is a pretty serious bug |
0a64365
to
9b7db30
Compare
@tomchristie I think this PR is ready for review, I described issue in previous comment, the fix is here https://github.com/encode/django-rest-framework/pull/9360/files#diff-9240f7dfb9eb2cace23eef00e4c922d6e2b6e85dc58b3c9d804e78c6c6227614R27-R34 the rest is just support code to perform that check (make sure that conditional fields values are present in serializer to perform check against condition). The condition check is actually copy of code from https://github.com/django/django/blob/7ba2a0db20c37a5b1500434ca4ed48022311c171/django/db/models/constraints.py#L672 |
9b7db30
to
5a3794b
Compare
we have this separate PR which seems to fix a regression, can you guys please check? #9482 |
I do not know how the situation is right now but I noticed that when upgrading from the 3.14.0 version to 3.15.2 my condition started to broke. Here is the model: `
` In the current state it stops to check the condition is_active=True and raises and exception if I try to create a new record with is_active=False for the same date. |
Is a new version expected with this fix and others related like #9531? The support for UniqueConstraint is not complete and may cause issues… |
fixes #9358