我正在尝试使用超链接连接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.