So I have this models:
# -------------------------------------------------------------- Load Drivers Model
class LoadDrivers(models.Model):
driver = models.ForeignKey(User, default=None, null=True, blank=True, on_delete=models.DO_NOTHING, limit_choices_to={'is_driver': True})
load_key = models.ForeignKey(Loads, on_delete=models.DO_NOTHING, related_name="loaddrivers")
driver_type = models.CharField(choices=DriverType.choices, max_length=2, default=None, null=True, blank=True)
# -------------------------------------------------------------- Loads Model
class Loads(models.Model):
bill_to = models.CharField(max_length=50)
price = models.DecimalField(default=None, null=True, blank=True, max_digits=15, decimal_places=2)
truck = models.ForeignKey(Trucks, on_delete=models.DO_NOTHING, null=True, blank=True, related_name="loadtrucks")
trailer = models.ForeignKey(Trailer, on_delete=models.DO_NOTHING, null=True, blank=True, related_name="loadtrailers")
load_number = models.CharField(max_length=50, default=None, unique=True)
notes = models.TextField(max_length=1000, default=None, null=True, blank=True)
I'm Building DRF API.
Now I'm currently making Edit view for this Loads, I created serializers, views , and everything works well, but there is only 1 problem, I really can't decide how can I get users dropdown list on front for this LoadDrivers field:
driver = models.ForeignKey(User, default=None, null=True, blank=True, on_delete=models.DO_NOTHING, limit_choices_to={'is_driver': True})
For example when I go to edit view and I wanna change driver, how can I get that users dropdown list? One way to do this, I think that would be to create separate API endpoint that returns all Users and then do some stuff with Javascript.
without DRF, with just forms and django templates, I would have {{ form }} and for driver field it would render with users dropdown list where 'is_driver': True as I mentioned it in LoadDriver model.
So this is my main problem.
There is also trailer, truck fields from Loads model, and there I have also the same problem, I have to get these lists, if I use Django templates, on EditView it generate like this:
So I need to get the same results with API, what is the best practice?
Just like you said, you'll need a second API endpoint for listing these dropdown data.
For the use case like dropdownlist, return as fewer fields as possible.
Also you may want to return trailer & truck dropdown in a single API call, if that's the only case in your app.
Views.py
@api_view(["GET"])
def list_users_choices(request):
is_driver = request.query_params.get('is_driver')
query_params = {}
if is_driver is not None:
query_params['is_driver'] = is_driver
user_qs = User.objects.filter(**query_params).only('id', 'username')
return UserSimpleSerializer(user_qs, many=True).data
Serializers.py
class UserSimpleSerializer(serializers.ModelSerializer):
class Meta:
model=User
fields=("id", "username')