为什么django-rest-framework会为两个视图生成相同的API url(两个视图都有相同的查询集)?

m1m5dgzv  于 2022-12-27  发布在  Go
关注(0)|答案(1)|浏览(146)

我的项目配置是这样的。这是realated到联系表。这里我有两种方法:客户从前端只能张贴(即发送消息)和管理员只能检索和列出的联系人。

    • 型号. py**
class Contact(models.Model):
        full_name = models.CharField(max_length=100)
        email =  models.EmailField()
        phone_no = models.CharField(max_length=10, validators=[validate_phone_no])
        message = models.TextField()
        created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    
        def __str__(self):
        return self.email
    • 序列化程序. py**
class ContactSerializer(serializers.ModelSerializer):
        class Meta: 
            model = Contact
            fields = [
                'full_name',
                'email',
                'phone_no',
                'message',
            ]
    • 浏览次数. py**
class ContactViewset(viewsets.ModelViewSet):
    permission_classes = [IsAuthenticated]
    queryset = Contact.objects.all()
    search_fields = []
    ordering_fields = []
    ordering = []
    http_method_names = ["options", "head", "get"]

    serializer_class = ContactSerializer

class CustomerContactViewSet(viewsets.ModelViewSet):
    permission_classes = [AllowAny]
    queryset = Contact.objects.all()
    http_method_names = ['post']

    serializer_class = ContactSerializer
    • 网址. py**
router.register("contacts-detail", ContactViewset)
router.register("contact-form", CustomerContactViewSet)

我的问题是:为什么DRF会为两个视图生成相同的url,尽管我为它们提供了不同的名称:

'contact-form'----> for posting and 
'contact-detail'--------> for listing the contacts
  • 两个视图都指向同一型号 *-这是原因吗?

Click Here to see generated api url
查看上次URL是否相同:然后重定向到"联系人表单"。我知道我可以用base_name来分隔这两个表单。
但我想知道生成相同网址背后的机制:

If anyone could explain this? Clearly
mqkwyuun

mqkwyuun1#

问题出在您定义路由器的方式上。请在www.example.com文件中注册调用urls.py。
router.register函数的第一个参数是视图集的基名称。此基名称用于生成视图集的URL模式。如果对多个视图集使用相同的基名称,则路由器将为这两个视图集生成相同的URL模式。
例如,在代码中定义了以下行:
路由器.注册(“联系人详细信息”,联系人视图集)路由器.注册(“联系人表单”,客户联系人视图集)
在这里,您为ContactViewSet使用了基本名称“contacts-detail”,为CustomerContactViewSet使用了基本名称“contact-form”。这将导致生成两种不同的URL模式:

/contacts-detail/
/contact-form/

但是,由于两个视图集使用相同的模型(Contact),路由器将为两个视图集生成相同的URL模式集。这就是为什么您在API中看到两个视图集的URL模式相同。
要解决此问题,可以为两个视图集使用不同的基本名称。例如,可以为ContactViewSet使用“contacts”,为CustomerContactViewSet使用“customer-contacts”。这将导致生成以下URL模式:

/contacts/
/customer-contacts/

相关问题