Saat ini saya memiliki banyak objek python dalam kode saya mirip dengan yang berikut:
class MyClass():
def __init__(self, name, friends):
self.myName = name
self.myFriends = [str(x) for x in friends]
Sekarang saya ingin mengubahnya menjadi model Django, di mana self.myName adalah bidang string, dan self.myFriends adalah daftar string.
from django.db import models
class myDjangoModelClass():
myName = models.CharField(max_length=64)
myFriends = ??? # what goes here?
Karena daftar adalah struktur data yang umum di python, saya semacam berharap akan ada bidang model Django untuk itu. Saya tahu saya bisa menggunakan hubungan ManyToMany atau OneToMany, tapi saya berharap untuk menghindari tipuan ekstra dalam kode.
Edit:
Saya menambahkan pertanyaan terkait ini , yang mungkin bermanfaat bagi orang.
python
django
django-models
bersedih
sumber
sumber
Jawaban:
Apakah hubungan ini tidak akan lebih baik diungkapkan sebagai hubungan kunci asing satu-ke-banyak ke
Friends
meja? Saya mengerti itumyFriends
hanya string tetapi saya akan berpikir bahwa desain yang lebih baik adalah untuk membuatFriend
model danMyClass
berisi realtionship kunci asing ke tabel yang dihasilkan.sumber
"Optimalisasi prematur adalah akar dari semua kejahatan."
Dengan mengingat hal itu, mari kita lakukan ini! Setelah aplikasi Anda mencapai titik tertentu, denormalkan data sangat umum. Dilakukan dengan benar, dapat menghemat banyak pencarian basis data yang mahal dengan biaya sedikit lebih banyak pembenahan.
Untuk mengembalikan
list
nama teman, kita harus membuat kelas Django Field khusus yang akan mengembalikan daftar saat diakses.David Cramer memposting panduan untuk membuat SeperatedValueField di blognya. Ini kodenya:
Logika kode ini berkaitan dengan nilai-nilai serialisasi dan deserializing dari database ke Python dan sebaliknya. Sekarang Anda dapat dengan mudah mengimpor dan menggunakan bidang khusus kami di kelas model:
sumber
my_vals = SeparatedValuesField(blank=True, default="")
tetapi mendapatkan IntegrityError karena NULLs. Apakah argumen default tidak diteruskan dengan benar?to_python
tidak lagi dipanggil saat dibaca. Jadi untuk membuat pekerjaan ini, Anda perlu menambahkan:def from_db_value(self, value, expression, connection, context): return self.to_python(value)
Cara sederhana untuk menyimpan daftar di Django adalah dengan hanya mengubahnya menjadi string JSON, dan kemudian menyimpannya sebagai Teks dalam model. Anda kemudian dapat mengambil daftar dengan mengubah string (JSON) kembali ke daftar python. Begini caranya:
"Daftar" akan disimpan dalam model Django Anda seperti:
Dalam kode view / controller Anda:
Menyimpan daftar dalam database:
Mengambil daftar dari database:
Secara konseptual, inilah yang terjadi:
sumber
Jika Anda menggunakan Django> = 1.9 dengan Postgres Anda dapat memanfaatkan keunggulan ArrayField
Dimungkinkan juga untuk memasukkan field array:
Seperti @ thane-brimhall sebutkan juga dimungkinkan untuk meminta elemen secara langsung. Referensi dokumentasi
sumber
Karena ini adalah pertanyaan lama, dan teknik Django pasti telah berubah secara signifikan sejak itu, jawaban ini mencerminkan Django versi 1.4, dan kemungkinan besar berlaku untuk v 1.5.
Django secara default menggunakan database relasional; Anda harus menggunakan mereka. Peta pertemanan dengan hubungan basis data (batasan kunci asing) dengan penggunaan ManyToManyField. Dengan melakukannya, Anda dapat menggunakan RelatedManagers untuk daftar teman, yang menggunakan kueryset cerdas. Anda dapat menggunakan semua metode yang tersedia seperti
filter
atauvalues_list
.Menggunakan
ManyToManyField
relasi dan properti:Anda dapat mengakses daftar teman pengguna dengan cara ini:
Namun perlu dicatat bahwa hubungan ini simetris: jika Joseph adalah teman Bob, maka Bob adalah teman Joseph.
sumber
sumber
Ingatlah bahwa ini pada akhirnya harus berakhir pada basis data relasional. Jadi menggunakan hubungan benar - benar adalah cara yang umum untuk menyelesaikan masalah ini. Jika Anda benar-benar bersikeras untuk menyimpan daftar di objek itu sendiri, Anda bisa membuatnya misalnya dipisahkan dengan koma, dan menyimpannya dalam string, dan kemudian menyediakan fungsi pengaksesor yang membagi string menjadi daftar. Dengan itu, Anda akan dibatasi hingga jumlah maksimum string, dan Anda akan kehilangan kueri yang efisien.
sumber
Jika Anda menggunakan postgres, Anda dapat menggunakan sesuatu seperti ini:
jika Anda memerlukan detail lebih lanjut, Anda dapat membaca di tautan di bawah ini: https://docs.djangoproject.com/pt-br/1.9/ref/contrib/postgres/fields/
sumber
Anda dapat menyimpan hampir semua objek menggunakan Django Pickle Field, ala cuplikan ini:
http://www.djangosnippets.org/snippets/513/
sumber
Menyimpan daftar string dalam model Django:
dan Anda bisa menyebutnya seperti ini:
sumber
Solusi saya, semoga membantu seseorang:
sumber
Menggunakan hubungan satu-ke-banyak (FK dari kelas Teman ke orang tua) akan membuat aplikasi Anda lebih skalabel (karena Anda dapat secara sepele memperluas objek Teman dengan atribut tambahan di luar nama sederhana). Dan inilah cara terbaik
sumber