Editview DRF 前端的外键下拉列表

问题描述 投票:0回答:1

所以我有这个模型:

# -------------------------------------------------------------- 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)

我正在构建 DRF API。

现在我正在为此负载制作编辑视图,我创建了序列化器、视图,一切都运行良好,但只有 1 个问题,我真的无法决定如何让用户下拉列表位于前面LoadDrivers 领域:

driver = models.ForeignKey(User, default=None, null=True, blank=True, on_delete=models.DO_NOTHING, limit_choices_to={'is_driver': True})

例如,当我进入编辑视图并想要更改驱动程序时,如何获取该用户下拉列表? 我认为实现此目的的一种方法是创建单独的 API 端点来返回所有用户,然后使用 Javascript 执行一些操作。

没有 DRF,只有表单和 django 模板,我会有 {{ form }} 并且对于驱动程序字段,它将呈现 以及用户下拉列表,其中 'is_driver':True 正如我在 LoadDriver 模型中提到的。

所以这是我的主要问题。

还有来自 Loads 模型的 trailertruck 字段,我也有同样的问题,我必须获取这些列表,如果我使用 Django 模板,在 EditView 上生成如下:

所以我需要使用 API 获得相同的结果,最佳实践是什么?

django django-models django-rest-framework django-views django-templates
1个回答
0
投票

正如您所说,您需要第二个 API 端点来列出这些下拉数据。

对于像下拉列表这样的用例,返回尽可能少的字段。

此外,如果您的应用程序中只有这种情况,您可能希望在单个 API 调用中返回拖车和卡车下拉列表。

视图.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

序列化器.py

    class UserSimpleSerializer(serializers.ModelSerializer):
        class Meta:
            model=User
            fields=("id", "username')

© www.soinside.com 2019 - 2024. All rights reserved.