Say I have an address
table and it has a postal_code
field -- ModelChoiceField does not allow me to use something other than PKs to validate existence correct? What would be the way to go? Normal input and use clean_*()
?
相关问题
- how to define constructor for Python's new Nam
- streaming md5sum of contents of a large remote tar
- How to get the background from multiple images by
- Django __str__ returned non-string (type NoneType)
- Evil ctypes hack in python
If
postal_code
is a foreign key to a PostalCode model that contains valid postal codes I would just use use a CharField and then do a clean like you suggested. My clean method would look like this:ModelChoiceFields are meant to be used to select between a choice of existing model instances. This is almost always best represented by some form of Select field.
That said do you really have a FK from address to postal_code as you're implying. What are you storing on a PostalCode table to justify the extra table that will need to be joined in for every address related query?
For most cases postal_code should simply be a CharField and in that case if you want to validate that the value is valid you can use the
choices
attribute with a list of valid postal codes. Keep in mind that maintaining a list of valid postal codes by hand is a huge hassle.If you really have a PostalCode table and think it's a good idea (which in some cases it could be) you may want to consider actually using the postal_code as the primary key rather than the default autoincrement since it's necessarily unique, makes your data more exportable, and solves your issue with validation.
What about
to_field_name
? I'm not sure if it's documented anywhere, but you can find it easily betweenModelChoiceField
constructor params: https://github.com/django/django/blob/master/django/forms/models.py. It is used to filter field queryset.For example: