#33724: Changing from list to set in `exclude` raises errors, and is not
documented.
-------------------------------------+-------------------------------------
     Reporter:  אורי                 |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Database layer       |                  Version:  4.1
  (models, ORM)                      |
     Severity:  Release blocker      |               Resolution:
     Keywords:                       |             Triage Stage:  Accepted
    Has patch:  0                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by Mariusz Felisiak):

 * cc: Carlton Gibson (added)


Comment:

 Replying to [comment:6 Claude Paroz]:
 > Still I wonder if the performance gain is worth the loss of consistency.
 I wouldn't mind if exclude was defined to always be a set, but having to
 code defensively by expecting list or set is a loss in my point of view.

 All built-in methods do exactly the same number of conversion as before
 1ea7e3157d1f9b4db71e768d75ea57e47dbd49f9 just using `set(...)` instead of
 `list(...)`. IMO we can document `set` as the preferable option, e.g.
 {{{#!diff
 diff --git a/docs/ref/models/instances.txt b/docs/ref/models/instances.txt
 index 9aa9486f4a..8601a19e64 100644
 --- a/docs/ref/models/instances.txt
 +++ b/docs/ref/models/instances.txt
 @@ -252,9 +252,9 @@ The first step ``full_clean()`` performs is to clean
 each individual field.
  .. method:: Model.clean_fields(exclude=None)

  This method will validate all fields on your model. The optional
 ``exclude``
 -argument lets you provide a list of field names to exclude from
 validation. It
 -will raise a :exc:`~django.core.exceptions.ValidationError` if any fields
 fail
 -validation.
 +argument lets you provide a ``set`` of field names to exclude from
 validation.
 +It will raise a :exc:`~django.core.exceptions.ValidationError` if any
 fields
 +fail validation.

  The second step ``full_clean()`` performs is to call
 :meth:`Model.clean()`.
  This method should be overridden to perform custom validation on your
 model.
 @@ -355,8 +355,8 @@ uniqueness constraints defined via
 :attr:`.Field.unique`,
  :attr:`.Field.unique_for_date`, :attr:`.Field.unique_for_month`,
  :attr:`.Field.unique_for_year`, or :attr:`Meta.unique_together
  <django.db.models.Options.unique_together>` on your model instead of
 individual
 -field values. The optional ``exclude`` argument allows you to provide a
 list of
 -field names to exclude from validation. It will raise a
 +field values. The optional ``exclude`` argument allows you to provide a
 ``set``
 +of field names to exclude from validation. It will raise a
  :exc:`~django.core.exceptions.ValidationError` if any fields fail
 validation.

  :class:`~django.db.models.UniqueConstraint`\s defined in the
 @@ -380,7 +380,7 @@ Finally, ``full_clean()`` will check any other
 constraints on your model.

  This method validates all constraints defined in
  :attr:`Meta.constraints <django.db.models.Options.constraints>`. The
 -optional ``exclude`` argument allows you to provide a list of field names
 to
 +optional ``exclude`` argument allows you to provide a ``set`` of field
 names to
  exclude from validation. It will raise a
  :exc:`~django.core.exceptions.ValidationError` if any constraints fail
  validation.
 diff --git a/docs/releases/4.1.txt b/docs/releases/4.1.txt
 index 7b922256ec..a1ec53e2ac 100644
 --- a/docs/releases/4.1.txt
 +++ b/docs/releases/4.1.txt
 @@ -561,6 +561,10 @@ Miscellaneous
    ``URLResolver._callback_strs``, and ``URLPattern.lookup_str()`` are
    moved to ``django.contrib.admindocs.utils``.

 +* Custom :meth:`.Model.clean_fields`, :meth:`.Model.validate_unique`, and
 +  :meth:`.Model.validate_constraints` methods now convert an ``exclude``
 +  value to the ``set``.
 +
  .. _deprecated-features-4.1:

 }}}
 Also, passing lists still works, but would not be documented anymore. What
 do you think?

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33724#comment:9>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/01070180e0ccf889-0512b872-e3c8-4b8b-9a49-b0155b3d1f67-000000%40eu-central-1.amazonses.com.

Reply via email to