为什么可以';我是否在Django Rest框架中为父级和子级使用自定义slug?
我正在尝试为父模型和子模型使用自定义段塞 型号:为什么可以';我是否在Django Rest框架中为父级和子级使用自定义slug?,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,我正在尝试为父模型和子模型使用自定义段塞 型号: # models.py class Parent(models.Model): slug = models.SlugField() class Child(models.Model): parent = models.ForeignKey(Parent) order = models.IntegerField() slug = models.SlugField() class Meta:
# models.py
class Parent(models.Model):
slug = models.SlugField()
class Child(models.Model):
parent = models.ForeignKey(Parent)
order = models.IntegerField()
slug = models.SlugField()
class Meta:
ordering = ['order', 'pk']
def save(self, *args, **kwargs):
self.slug = f"{parent.slug}/{self.order}"
super(Text, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse("app:child-detail", kwargs={"slug": self.slug})
子模型将在其slug中使用其顺序和父模型的slug
我可以在URL中使用默认的
,但当我尝试将其切换到
时,我在列表视图和详细视图中都会遇到此错误:
无法使用视图名称解析超链接关系的URL
“应用程序:子详细信息”。您可能未能包括相关模型
在API中,或未正确配置上的lookup\u字段
属性
这个领域
当我尝试对子对象调用get_absolute_url()时(其中顺序为“1”,父对象的slug为“parent slug”),会出现以下错误:
django.url.exceptions.NoReverseMatch:与“子详细信息”相反
找不到关键字参数“{'slug':'parent slug/1'}”。2幅(s)
尝试:
['api/v1/child/(?P[-a-zA-Z0-9_]+)(?P\.[a-Z0-9]+/?)$,
“api/v1/child/(?P[-a-zA-Z0-9_]+)$”
网址:
序列化程序:
# app serializers.py
class ChildSerializer(serializers.HyperlinkedModelSerializer):
url = HyperlinkedIdentityField(
view_name="app:child-detail", lookup_field="slug"
)
class Meta:
fields = ("url", "pk")
model = Child
# Commented out code below also doesn't work
# lookup_field = "slug"
# extra_kwargs = {"url": {"lookup_field": "slug"}}
class ChildDetailSerializer(serializers.HyperlinkedModelSerializer):
url = HyperlinkedIdentityField(
view_name="app:child-detail", lookup_field="slug"
)
class Meta:
fields = ("url", "pk")
model = Child
# Commented out code below also doesn't work
# lookup_field = "slug"
# extra_kwargs = {"url": {"lookup_field": "slug"}}
非常感谢您的帮助。“{parent.slug}/{self.order}”
-这不是
Slug是报纸上的一个术语。slug是某事物的短标签,只包含字母、数字、下划线或连字符。它们通常用于URL
slug字段中不允许使用反斜杠或正斜杠。这就是为什么
模式不接受它-值parent/1
不是有效的slug
在将任何内容保存到SlugField之前,请考虑使用或不同的分隔符(允许使用段塞)或使用函数。谢谢。但是,当我将SlugField的“/”替换为“-”时,我收到了相同的错误,因此发生了其他一些事情。以前创建的记录已经在DB中,因此请在DB中更新现有记录的此字段。清除了我的数据库,现在一切正常。非常感谢。
# app views.py
class ChildList(generics.ListCreateAPIView):
queryset = Child.objects.all()
serializer_class = ChildSerializer
lookup_field = "slug"
class ChilldDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = Child.objects.all()
serializer_class = ChildDetailSerializer
lookup_field = "slug"
# app serializers.py
class ChildSerializer(serializers.HyperlinkedModelSerializer):
url = HyperlinkedIdentityField(
view_name="app:child-detail", lookup_field="slug"
)
class Meta:
fields = ("url", "pk")
model = Child
# Commented out code below also doesn't work
# lookup_field = "slug"
# extra_kwargs = {"url": {"lookup_field": "slug"}}
class ChildDetailSerializer(serializers.HyperlinkedModelSerializer):
url = HyperlinkedIdentityField(
view_name="app:child-detail", lookup_field="slug"
)
class Meta:
fields = ("url", "pk")
model = Child
# Commented out code below also doesn't work
# lookup_field = "slug"
# extra_kwargs = {"url": {"lookup_field": "slug"}}