Django ModelChoiceField: ¿usas algo que no sea id?

Digamos que tengo una tabla de address y tiene un campo de código postal. ¿ModelChoiceField no me permite usar otra cosa que no sea PK para validar la existencia correcta? ¿Cuál sería el camino a seguir? Entrada normal y uso clean_*() ?

¿Qué hay de to_field_name ? No estoy seguro de si está documentado en cualquier lugar, pero puede encontrarlo fácilmente entre los ModelChoiceField constructor ModelChoiceField : https://github.com/django/django/blob/master/django/forms/models.py . Se utiliza para filtrar el campo queryset.

Por ejemplo:

 articles = ModelChoiceField(queryset=Articles.objects.all(), to_field_name='slug') 

Si postal_code es una clave foránea para un modelo PostalCode que contiene códigos postales válidos, solo usaría un CharField y luego realizaría una limpieza como sugeriste. Mi método limpio se vería así:

 def clean_postal_code(self): try: code = PostalCode.objects.get(code_field=self.data['postal_code']) except: raise forms.ValidationError("Please enter a valid postal code") return code 

Los ModelChoiceFields deben utilizarse para seleccionar entre una elección de instancias de modelos existentes. Esto casi siempre está mejor representado por alguna forma de campo Seleccionar.

Dicho esto, realmente tienes un FK de dirección a código postal como estás insinuando. ¿Qué está almacenando en una tabla de PostalCode para justificar la tabla adicional que deberá unirse para cada consulta relacionada con la dirección?

Para la mayoría de los casos, postal_code debería ser simplemente un campo de caracteres y, en ese caso, si quiere validar que el valor es válido, puede usar el atributo de choices con una lista de códigos postales válidos. Tenga en cuenta que mantener una lista de códigos postales válidos a mano es una gran molestia.

Si realmente tiene una tabla PostalCode y cree que es una buena idea (lo que en algunos casos podría ser), debería considerar usar realmente el código postal como la clave principal en lugar del autoincremento predeterminado, ya que es necesariamente único, hace que sus datos sean más exportables. , y resuelve tu problema con la validación.