Search code examples
djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-templates

Foreignkey dropdown list on frontend for Editview DRF


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:

enter image description here

So I need to get the same results with API, what is the best practice?


Solution

  • 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')