Django Model Attitude

I have models

class Event(models.Model): name = models.CharField(max_length = 50) class DriverClass(models.Model): name = models.CharField(max_length = 20) event = models.ForeignKey(Event) class Driver(models.Model): name = models.CharField(max_length = 50) event = models.ForeignKey(Event) driverclass = models.ForeignKey(DriverClass) 

It is assumed that the event must have a given number of DriverClass es for Driver . The problem is that a Driver connected only to DriverClass and a Event , so when I select DriverClass for a driver in django admin , I can choose from all DriverClass es. I am not sure if there is something that I can change in my model to accomplish what I want, or I need to change the Driver ModelAdmin class to display only the correct events. What is the correct procedure?

+4
source share
2 answers

You must specify a custom ModelForm that modifies the set of fieldclass field requests and adds it to your ModelAdmin :

 class DriverForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(DriverForm, self).__init__(*args, **kwargs) if self.instance.event: # this form has an event specified in either instance, initial or data self.fields['driverclass'].queryset = DriverClass.objects.filter(event=self.instance.event) class DriverAdmin(admin.ModelAdmin): form = DriverForm 

One caveat is that when you change Event parameters for DriverClass not updated until the form is DriverClass . The form will raise a ValidationError, and the returned form will have the right choice. Ajax requests and dynamic updates through Javascript will be required to change this behavior.

+4
source

Brainiac games are true. This is something you could model as if you insisted on having an event property on the drivers:

 class Event(models.Model): name = models.CharField(max_length = 50) class DriverClass(models.Model): name = models.CharField(max_length = 20) event = models.ForeignKey(Event) class Driver(models.Model): name = models.CharField(max_length = 50) driverclass = models.ForeignKey(DriverClass) @property def event(self): return self.driverclass.event 

Just read Django: ForeignKey limit_choices_to to map the client to the current object to see that the way you want is actually a "weird way". In how you want referential integrity not guaranteed.

0
source

Source: https://habr.com/ru/post/1492524/


All Articles