Django ModelChoiceField - use something other than id?

ε祈祈猫儿з 提交于 2020-01-12 07:09:55

问题


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_*()?


回答1:


What about to_field_name? I'm not sure if it's documented anywhere, but you can find it easily between ModelChoiceField constructor params: https://github.com/django/django/blob/master/django/forms/models.py. It is used to filter field queryset.

For example:

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



回答2:


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:

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



回答3:


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.



来源:https://stackoverflow.com/questions/9827057/django-modelchoicefield-use-something-other-than-id

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!