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 级。
如何生成查询集以防止重复?