1. class Component(models.Model):
    2. """
    3. 组件
    4. """
    5. component_name = models.CharField(
    6. help_text='组件的名称',
    7. max_length=32
    8. )
    9. supplier_name = models.CharField(
    10. help_text='组件的开发者/组织的名称',
    11. max_length=128, null=True, blank=True
    12. )
    13. version = models.CharField(
    14. help_text='组件的版本',
    15. max_length=128
    16. )
    17. type = models.CharField(
    18. help_text='包的类型,例如maven, npm, nuget, gem, pypi, etc.',
    19. max_length=16,
    20. )
    21. parent = models.ForeignKey(
    22. help_text='包含的子组件',
    23. to='self',
    24. on_delete=models.CASCADE,
    25. null=True,
    26. blank=True,
    27. related_name='children',
    28. )
    29. class Meta:
    30. verbose_name = '软件的组件模型'
    31. verbose_name_plural = verbose_name
    1. class ComponentSerializer(serializers.ModelSerializer):
    2. class Meta:
    3. model = sbom_models.Component
    4. fields = [
    5. 'id', 'supplier_name', 'component_name', 'version', 'children',
    6. ]
    7. depth = 1

    有一个好技巧,在List的时候不显示children,在Detailde时候则显示children

    1. class ComponentItemSerializer(serializers.ModelSerializer):
    2. class Meta:
    3. model = sbom_models.Component
    4. fields = [
    5. 'id', 'supplier_name', 'component_name', 'version'
    6. ]
    7. class ComponentSerializer(serializers.ModelSerializer):
    8. class Meta:
    9. model = sbom_models.Component
    10. fields = [
    11. 'id', 'supplier_name', 'component_name', 'version', 'children',
    12. ]
    13. depth = 1
    1. class ComponentList(generics.ListCreateAPIView):
    2. serializer_class = serializers.ComponentItemSerializer
    3. queryset = models.Component.objects.all()
    4. class ComponentDetail(generics.RetrieveAPIView):
    5. serializer_class = serializers.ComponentSerializer
    6. queryset = models.Component.objects.all()