Hi Torsten,
> On Oct 31, 2014, at 3:13 AM, Torsten Bronger <[email protected]>
> wrote:
> Do I understand it correctly that in the Django community, it is
> preferred to use surrogate primary keys (the auto ID field) instead
> of explicitly setting primary keys?
Yes, I'd say this is true.
> Currently, I add natural_key()
> methods to many of my models, but some of them return only one
> field. Now I wonder whether I made a mistake and should have chosen
> that field as the primary key.
>
> My use case is that I need to retrieve the natural keys of all
> objects in the database of a particular model. As far as I can see,
> this can only be achieved by fetching all objects and calling the
> natural_key() method for all of them. In contrast,
>
> model.objects.values_list("pk", flat=True)
>
> is probably *much* faster.
>
> Is it possibly to specify a single field a natural key somehow
> (besides making it the PK)? For example, it is possible to add a
> Meta attribute to the model?
There is no built in feature for this, but it doesn't seem like a hard problem
to solve with your own conventions. For instance, rather than hardcoding the
name of the natural key field inside the natural_key method, make it a model
class attribute, e.g. MyModel.natural_key_field. Then the natural_key method
can return getattr(self, self.natural_key_field) (you could even implement this
method just once in an abstract base or mixin), and you can also use the
attribute to do your efficient query:
MyModel.objects.values_list(MyModel.natural_key_field, flat=True)
There may be reasons to consider natural primary keys in your data model
(though personally I think surrogates are usually a better choice), but I don't
think the problem you presented implies that you made the wrong choice.
Carl
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/7EC7C040-056D-422F-BE10-0707F72F230C%40oddbird.net.
For more options, visit https://groups.google.com/d/optout.