Django Rest Framework 检索对象详细信息在使用 MPTT 和 UUID 作为对象 ID 时返回“未找到”

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

DRF 模型与 UUID 字段和 MPTT 的组合面临“未找到”的问题。

我有一个只有一个应用程序的简单api

"categories"
(模仿电子商店类别)。

models.py

class Category(MPTTModel):

    objects = CategoryManager()

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=120, db_index=True, unique=True)
    slug = models.SlugField(unique=True)
    description = models.TextField(null=True, blank=True)
    parent = TreeForeignKey( 
        "self",
        blank=True,
        null=True,
        related_name="child",
        on_delete=models.CASCADE
    )
    is_active = models.BooleanField(default=True)

    class Meta:
        verbose_name_plural = 'categories'

    def get_absolute_url(self):
        return f"/products/{self.slug}/"

    def __str__(self) -> str:
        return self.name

然后我遇到了一个问题:当试图获取具有

Category.objects.all()
的所有对象(根端点)的列表时,所有子项都被复制(首先在父项的子字段中,然后作为下面的单个对象)。

所以我修改了 MPTT

TreeManager
添加一个方法:

class CategoryManager(TreeManager):
    def viewable(self):
        queryset = self.get_queryset().filter(level=0)
        return queryset

解决了一个问题。但是现在,当我尝试获取单个对象的详细信息时,我得到了

{"detail": "Not found"}
,但父对象除外。

有什么方法可以在不复制的情况下继续显示所有对象,并且仍然能够访问单个对象的详细信息?

views.py

class CategoriesAPIViewSet(viewsets.ModelViewSet):

    queryset = Category.objects.viewable()
    serializer_class = CategorySerializer
    lookup_field = 'slug'
    # permission_classes = (IsAuthenticated,)

serializers.py

class CategorySerializer(serializers.ModelSerializer):
    child = RecursiveField(many=True, read_only=True)

    class Meta:
        model = Category
        fields = ("id", "name", "slug", "description", "is_active", "parent", "child")
        lookup_field = 'slug'
        extra_kwargs = {
            'url': {'lookup_field': 'slug'}
        }

提前致谢

更新 1: 我在

queryset = Category.objects.viewable()
中意识到这个问题,因为我只返回对象 0 级。 如何生成查询集以防止重复?

django django-rest-framework django-mptt
© www.soinside.com 2019 - 2024. All rights reserved.