Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我是否在Django Rest框架中为父级和子级使用自定义slug?_Django_Django Models_Django Rest Framework_Django Views - Fatal编程技术网

为什么可以';我是否在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"}}