Django Rest外键的外键

时间:2019-07-27 09:43:33

标签: django django-rest-framework

我正在尝试使用超链接连接2个对象。

我有一个Company对象和一个“ Client”对象,一家公司有多个客户,所以models.py看起来像这样:

models.py:

class Company(models.Model):
    name = models.CharField(max_length=200)
    lookup_field = 'id'

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('common_app:company-detail', kwargs={'id': self.id})

    class Meta:
        ordering = ['-id']


class Client(models.Model):
    image = models.ImageField()
    name = models.CharField(max_length=200)
    company = models.ForeignKey(Company, on_delete=models.SET_NULL, null=True, default=None)
    verified = models.BooleanField(default=False)
    lookup_field = 'id'

    def get_absolute_url(self):
        return reverse('common_app:client-detail', kwargs={'id': self.id})

    def __str__(self):
        return self.name

序列化器:

class ClientSerializer(serializers.HyperlinkedModelSerializer):
    url = serializers.HyperlinkedIdentityField(view_name="common_app:client-detail")
    company = serializers.HyperlinkedRelatedField(read_only=True, view_name='common_app:company-detail')
    read_only = ('id', )
    lookup_field = 'id'

    class Meta:
        model = Client
        fields = ('url', 'name', 'company')


class ClientImageSerializer(serializers.HyperlinkedModelSerializer):
    client = ClientSerializer(many=True)

    class Meta:
        model = ClientImage
        fields = '__all__'

views.py:

class CompanyViewSet(BaseModelViewSet):
    serializer_class = CompanySerializer
    queryset = Company.objects.all()
    lookup_field = "id"


class ClientViewSet(BaseModelViewSet):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()
    lookup_field = "id"

urls.py:

app_name = 'common_app'

router = DefaultRouter()
router.register('client', ClientViewSet, basename='client')
router.register('company', CompanyViewSet, basename='company')

for url in router.urls:
    print(url.__dict__)


urlpatterns = [
    path('api/', include(router.urls)),
]

我无法理解出了什么问题(我试图将lookup_field放到任何地方),但是我得到了:

    E           django.core.exceptions.ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "client-detail". 
You may have failed to include the related model in your API, or incorrectly configured the `lookup_field` attribute on this field.

0 个答案:

没有答案