Vyvíjam projekt Django s tromi hlavnýmitriedy: trieda A, trieda B a trieda C. Objekty triedy C sa skladajú z objektov tried A a B v špecifickom poradí. Všetky sú uložené v databáze MySQL.
V súčasnej dobe mám:
class A(models.Model):
name = models.CharField(max_length=250)
class B(models.Model):
name = models.CharField(max_length=250)
class C(models.Model):
name = models.CharField(max_length=250)
composed_of = PickledObjectField(blank=True)
Preto pri vytváraní objektov C robím nasledovné:
c1 = C()
c1.composed_of = [a1, b4, a1, b1, a2, b2, b3, b4, a2, a5]
c1.save()
pričom a1..a5 sú príklady A a b1..b5 sú príklady B.
Toto funguje, ale nie je to vôbec dobré z dvoch dôvodov: 1. Je hrozné, keď potrebujem požiadať o toto pole; 2. Ak sú inštancie A alebo B aktualizované alebo vymazané z databázy, zmena sa v inštanciách C neuskutoční.
Moja otázka: Ako môžem vytvoriť triedu s príkladmi odkazujúcimi na inštancie z iných tried v konkrétnom poradí?
Používam Django 1.8 s Python 2.7.
odpovede:
0 pre odpoveď č. 1Po prvé, ak chcete odkazovať na iné modely, mali by ste použiť vzťah medzi mnohými (models.ManyToManyField
).
Po druhé, keďže máte rôzne modely, na ktoré sa chcete odvolávať, musíte použiť všeobecné cudzie kľúče od Django rámec obsahu, takže môžete prepojiť ľubovoľný typ. Teraz je tu dobrý príspevok v blogu s kódom, ako to aplikovať na vzťah medzi mnohými.
Po tretie, keďže si chcete objednať objekty vzťahu, musíte každému vzťahu poskytnúť znak order_number
takže budete potrebovať tzv through
tabuľka (dokumentáciu).
Spravovanie týchto poradových čísel môže byť dosť komplikované, keď sa veci menia, tento problém vyriešil dobrý balík: Django-objednal-modelu, ale som si istý, že sú aj iní. Vyhľadajte „objednané vzťahy medzi mnohými v Django“. Pravdepodobne budete musieť prispôsobiť použitie tak, aby ste ich používali na všeobecné vzťahy m2m.