Saya sedang membangun sebuah proyek dalam Django Rest Framework di mana pengguna dapat masuk untuk melihat gudang anggur mereka. ModelViewSets saya berfungsi dengan baik dan tiba-tiba saya mendapatkan kesalahan yang membuat frustrasi ini:
Tidak dapat menyelesaikan URL untuk hubungan hyperlink menggunakan nama tampilan "detail pengguna". Anda mungkin gagal memasukkan model terkait di API Anda, atau salah mengonfigurasi
lookup_field
atribut di bidang ini.
Traceback menunjukkan:
[12/Dec/2013 18:35:29] "GET /bottles/ HTTP/1.1" 500 76677
Internal Server Error: /bottles/
Traceback (most recent call last):
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/viewsets.py", line 78, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 399, in dispatch
response = self.handle_exception(exc)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/views.py", line 396, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/mixins.py", line 96, in list
return Response(serializer.data)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 535, in data
self._data = [self.to_native(item) for item in obj]
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/serializers.py", line 325, in to_native
value = field.field_to_native(obj, field_name)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 153, in field_to_native
return self.to_native(value)
File "/Users/bpipat/.virtualenvs/usertest2/lib/python2.7/site-packages/rest_framework/relations.py", line 452, in to_native
raise Exception(msg % view_name)
Exception: Could not resolve URL for hyperlinked relationship using view
name "user-detail". You may have failed to include the related model in
your API, or incorrectly configured the `lookup_field` attribute on this
field.
Saya memiliki model pengguna email ubahsuaian dan model botol di models.py adalah:
class Bottle(models.Model):
wine = models.ForeignKey(Wine, null=False)
user = models.ForeignKey(User, null=False, related_name='bottles')
Serializers saya:
class BottleSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Bottle
fields = ('url', 'wine', 'user')
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'password', 'is_superuser')
Pandangan saya:
class BottleViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows bottles to be viewed or edited.
"""
queryset = Bottle.objects.all()
serializer_class = BottleSerializer
class UserViewSet(ListCreateAPIView):
"""
API endpoint that allows users to be viewed or edited.
"""
queryset = User.objects.all()
serializer_class = UserSerializer
dan terakhir url:
router = routers.DefaultRouter()
router.register(r'bottles', views.BottleViewSet, base_name='bottles')
urlpatterns = patterns('',
url(r'^', include(router.urls)),
# ...
Saya tidak memiliki tampilan detail pengguna dan saya tidak melihat dari mana masalah ini bisa berasal. Ada ide?
Terima kasih
sumber
Saya menemukan kesalahan ini juga dan menyelesaikannya sebagai berikut:
Alasannya adalah saya lupa memberikan namespace "** - detail" (view_name, misalnya: user-detail). Jadi, Kerangka Istirahat Django tidak dapat menemukan tampilan itu.
Ada satu aplikasi dalam proyek saya, anggaplah nama proyek saya adalah
myproject
, dan nama aplikasinya adalahmyapp
.Ada dua file urls.py, satu adalah
myproject/urls.py
dan yang lainnya adalahmyapp/urls.py
. Saya memberi aplikasi ruang namamyproject/urls.py
, seperti:Saya mendaftarkan router kerangka kerja lainnya
myapp/urls.py
, dan kemudian mendapatkan kesalahan ini.Solusi saya adalah memberikan url dengan namespace secara eksplisit:
Dan itu memecahkan masalah saya.
sumber
extra_kwargs = {'url': {'view_name': 'myapp:user-detail'}}
Mungkin seseorang dapat melihat ini: http://www.django-rest-framework.org/api-guide/routers/
Jika menggunakan namespacing dengan serializers hyperlink, Anda juga harus memastikan bahwa parameter view_name pada serializers mencerminkan namespace dengan benar. Sebagai contoh:
Anda harus menyertakan parameter seperti
view_name='api:user-detail'
untuk bidang serializer yang memiliki hyperlink ke tampilan detail pengguna.sumber
urls.py
bersarang ganda dalamnewsite
proyek saya : (1)newsite/urls.py
(dibuat oleh django) (2)polls/urls.py
(3)polls/api/v1/urls.py
............ Saya harus menyebutkan nama bersarang menggunakanurl = serializers.HyperlinkedIdentityField(view_name="polls:polls_api:user-detail")
Kesalahan besar lainnya yang menyebabkan kesalahan ini adalah membuat base_name tidak perlu didefinisikan di urls.py. Sebagai contoh:
Ini akan menyebabkan kesalahan yang disebutkan di atas. Keluarkan base_name itu dari sana dan kembali ke API yang berfungsi. Kode di bawah ini akan memperbaiki kesalahan tersebut. Hore!
Bagaimanapun, anda mungkin tidak hanya menambahkan base_name secara sembarangan, anda mungkin telah melakukannya karena anda mendefinisikan sebuah def get_queryset () kustom untuk View dan Django mengamanatkan anda menambahkan base_name. Dalam hal ini Anda harus secara eksplisit mendefinisikan 'url' sebagai HyperlinkedIdentityField untuk serializer yang dimaksud. Perhatikan bahwa kita mendefinisikan HyperlinkedIdentityField ini PADA SERIALIZER tampilan yang menampilkan kesalahan. Jika kesalahan saya adalah "Tidak dapat menyelesaikan URL untuk hubungan hyperlink menggunakan nama tampilan" study-detail ". Anda mungkin gagal memasukkan model terkait di API Anda, atau salah mengonfigurasi
lookup_field
atribut di bidang ini." Saya bisa memperbaikinya dengan kode berikut.ModelViewSet saya (get_queryset khusus adalah mengapa saya harus menambahkan base_name ke router.register () di tempat pertama):
Pendaftaran router saya untuk ModelViewSet ini di urls.py:
DAN DI SINI DIMANA UANG INI! Kemudian saya bisa menyelesaikannya seperti ini:
Ya. Anda harus secara eksplisit mendefinisikan HyperlinkedIdentityField ini pada dirinya sendiri agar dapat berfungsi. Dan Anda perlu memastikan bahwa
view_name
definisi di HyperlinkedIdentityField sama seperti yang Anda definisikan dibase_name
dalam urls.py dengan '-detail' ditambahkan setelahnya.sumber
<app_name>:studies-detail
. Misalnya saya jika aplikasi saya dipanggiltanks
, maka jalur lengkapnya adalahHyperlinkedIdentityField(view_name="tanks:studies-detail")
. Untuk mengetahuinya saya menggunakan perintah django-exensionsshow_urls
, untuk melihat rute lengkap dan label yang dibuat oleh router secara otomatis.Kode ini juga harus berfungsi.
sumber
UserSerializer
harus diterapkan (belum siap untuk diimpor), seperti yang ditunjukkan di django-rest-framework.org/api-guide/serializersSaya mengalami kesalahan ini setelah menambahkan namespace ke url saya
dan menambahkan app_name ke urls.py saya
Saya menyelesaikan ini dengan menentukan NamespaceVersioning untuk api kerangka istirahat saya di settings.py dari proyek saya
sumber
Hari ini, saya mendapat kesalahan yang sama dan perubahan di bawah menyelamatkan saya.
Perubahan
untuk:
sumber
Kesalahan yang sama, tetapi alasan berbeda:
Saya mendefinisikan model pengguna khusus, tidak ada bidang baru:
Ini adalah fungsi tampilan saya:
Karena saya tidak
queryset
langsung menyerahUserViewSet
, saya harus mengaturbase_name
kapan saya mendaftarkan viewset ini. Di sinilah pesan kesalahan saya disebabkan olehurls.py
file:Anda membutuhkan nama yang
base_name
sama dengan model Anda -customuser
.sumber
Jika Anda memperluas kelas GenericViewSet dan ListModelMixin , dan mengalami kesalahan yang sama saat menambahkan bidang url dalam tampilan daftar, itu karena Anda tidak mendefinisikan tampilan detail. Pastikan Anda memperluas mixin RetrieveModelMixin :
sumber
Tampaknya
HyperlinkedModelSerializer
tidak setuju dengan memiliki jalannamespace
. Dalam aplikasi saya, saya membuat dua perubahan.Di file url yang diimpor
Semoga ini membantu.
sumber
Saya mengalami kesalahan yang sama ketika saya mengikuti panduan mulai cepat DRF http://www.django-rest-framework.org/tutorial/quickstart/ dan kemudian mencoba menjelajah ke / users. Saya telah melakukan pengaturan ini berkali-kali sebelumnya tanpa masalah.
Solusi saya bukan dalam kode tetapi dalam mengganti database.
Perbedaan antara instalasi ini dan yang lainnya sebelumnya adalah ketika saya membuat database lokal.
Kali ini saya berlari
segera setelah berlari
Alih-alih urutan persis yang tercantum dalam panduan.
Saya curiga ada sesuatu yang tidak dibuat dengan benar di DB. Saya tidak peduli dengan dev db saya jadi saya menghapusnya dan menjalankan
./manage.py migrate
perintah sekali lagi, membuat pengguna super, menjelajahi / users dan kesalahannya hilang.Ada yang bermasalah dengan urutan operasi yang saya konfigurasikan DRF dan db.
Jika Anda menggunakan sqlite dan dapat menguji perubahan ke DB baru, maka patut dicoba sebelum Anda membedah semua kode Anda.
sumber
Bottle = serializers.PrimaryKeyRelatedField (read_only = True)
read_only memungkinkan Anda untuk mewakili bidang tanpa harus menautkannya ke tampilan lain dari model.
sumber
Saya mendapat kesalahan itu di DRF 3.7.7 ketika nilai siput kosong (sama dengan '') di database.
sumber
Saya mengalami masalah yang sama ini dan mengatasinya dengan menambahkan
generics.RetrieveAPIView
sebagai kelas dasar ke kumpulan tampilan saya.sumber
Saya terjebak dalam kesalahan ini selama hampir 2 jam:
Tidak Sesuai Dikonfigurasi di / api_users / users / 1 / Tidak dapat menyelesaikan URL untuk hubungan hyperlink menggunakan nama tampilan "detail pengguna". Anda mungkin gagal memasukkan model terkait di API Anda, atau salah mengonfigurasi
lookup_field
atribut di bidang ini.Ketika saya akhirnya mendapatkan solusinya tetapi saya tidak mengerti mengapa, jadi kode saya adalah:
tetapi di URL utama saya, itu adalah:
Jadi untuk akhirnya saya menyelesaikan masalah menghapus namespace:
Dan saya akhirnya menyelesaikan masalah saya, jadi siapa pun dapat memberi tahu saya alasannya, yang terbaik.
sumber
Jika Anda menghilangkan field 'id' dan 'url' dari serializer Anda, Anda tidak akan mengalami masalah. Anda dapat mengakses posting dengan menggunakan id yang dikembalikan di objek json, yang membuatnya lebih mudah untuk mengimplementasikan frontend Anda.
sumber
Saya memiliki masalah yang sama, saya pikir Anda harus memeriksa
get_absolute_url
judul metode input nilai model objek (** kwargs). dan gunakan nama bidang yang tepat di lookup_field
sumber