【问题标题】:How to loop through multiple array based on foreign key selection如何根据外键选择循环遍历多个数组
【发布时间】:2021-02-14 08:49:00
【问题描述】:

我正在尝试创建一个 django react 应用程序。我正在尝试从 django 获取数据以做出反应。我被困在需要循环多个数组的地方。

这是我的 serializer.py

class ServiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Service
        fields = ('id', 'title', 'description')


class TechnologiesAndFrameworkSerializer(serializers.ModelSerializer):
    class Meta:
        model = TechnologiesAndFramework
        fields = ('id', 'title', 'description', 'service')

这是我的models.py

 class Service(models.Model):
    title = models.CharField(blank=False, null=False, max_length=256)
    description = models.CharField(blank=False, null=False, max_length=256)

    def __str__(self):
        return self.title

 class TechnologiesAndFramework(models.Model):
    title = models.CharField(blank=False, null=False, max_length=256)
    description = models.CharField(blank=False, null=False, max_length=256)
    service = models.ForeignKey(Service, on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.title

这是我的观点.py

  class ServiceViewSet(viewsets.ModelViewSet):
      serializer_class = ServiceSerializer
      queryset = Service.objects.all()
      permission_classes = [permissions.AllowAny]


   class TechnologiesAndFrameworkViewSet(viewsets.ModelViewSet):
      serializer_class = TechnologiesAndFrameworkSerializer
      queryset = TechnologiesAndFramework.objects.all()
      permission_classes = [permissions.AllowAny]

所以在后端,服务模型有

  • 前端
  • 后端
  • 部署

我的 TechnologiesAndFramework 有

  • 姜戈
  • 反应 JS
  • 码头工人
  • 鹡鸰
  • 引导程序
  • Postgres

我想基于服务循环遍历 TechnologiesAndFramework。

所以输出应该是这样的。

  1. 前端

    • 反应 JS
    • 鹡鸰
    • 引导程序
  2. 后台

    • 姜戈
    • Postgres
  3. 部署

    • 码头工人

我怎样才能实现这种格式?

目前这是我的反应代码的样子

const [service, setService] = useState([]);
  const [framework, setFramework] = useState([]);

  useEffect(() => {
    fetch("http://localhost:8000/api/work/service")
      .then((res) => res.json())
      .then(setService);
    fetch("http://localhost:8000/api/work/f&t")
      .then((res) => res.json())
      .then(setFramework);
  }, []);

  <div className="progress-bars">
            {framework &&
              service &&
              framework.map((item, index) => {
                console.log(framework)
                return (
                  <>
                    <h1>{service[item]}</h1>
                    <h1>{item.title}</h1>
                  </>
                );
              })}
          </div>

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 尝试将您的 .then 方法更改为 --> .then(response => setService(response))
  • Radwan Abu-Odeh 建议的解决方案对我有用。不过感谢@nir shabi 的回复。

标签: reactjs django django-models django-rest-framework django-views


【解决方案1】:

在 Django 中,如果两个模型之间存在 1-M 关系,Django 会添加一个属性,以便您 1 Model 访问 M-related 对象,它总是带有名称x_set 其中x -&gt; the model name lowercase,您也可以重命名它以便使用正确的名称访问它。

所以我建议你重命名models.py 中的属性:

...

 class TechnologiesAndFramework(models.Model):
    ...
    # like this, just add related_name attribute.
    service = models.ForeignKey(Service, on_delete=models.CASCADE, null=True, related_name='technologies')
....

现在做makemigrations和migrate

现在添加related_name 后,只需在ServiceSerializer 中引用它,SlugRelatedField 如下所示:

class ServiceSerializer(serializers.ModelSerializer):
    technologies = serializers.SlugRelatedField(read_only=True, many=True, slug_field='title')
    class Meta:
        model = Service
        fields = ('id', 'title', 'description', 'technologies')

现在您的响应应该如下所示:

[
 { 
    "id": "your_service_id", 
    "title": "backend for example", 
    "description": "Your description",
    "technologies": [
        "Django", "Postgres", ...
    ]
 },
....
]

【讨论】:

  • 非常感谢拉德万的帮助。这就是我所需要的。感谢您解释所有步骤。但是你能告诉我我们在这里实际上在做什么技术 = serializers.SlugRelatedField(read_only=True, many=True, slug_field='title')。对不起,我是 django 的新手。
  • 是的,所以SlugRelatedField,基本上是DRF在关系上映射相关字符串的一种方式,many=True表示该字段是多关系,结果将超过一个字符串,slug_field 是告诉 DRF 从每个模型对象中的哪个字段获取值,read_only=True 是告诉 DRF 该字段不会接受对该关系的写入请求。
  • 我还建议您阅读此文档django-rest-framework.org/api-guide/relations,它进一步详细解释了这一点。
  • 太棒了。非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-24
  • 2011-08-28
  • 2019-10-14
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多