Split Vzor prohlášení mezi několik aplikace v Django

0

Otázka

Já jsem pracoval a budování své webové stránky s Django a jsem čelí tento logický problém.

Můj projekt je tvořen několika app.

Chtěl bych vyhlásit v každé z těchto "kus" větší model, který bude zastoupena v jedné tabulce- Příklad:

  • model, Člověk
  • model DetailsPerson

Jako každé jednotlivé aplikace určuje zvláštní část osoby, můj nápad byl, aby decentralizaci prohlášení o DetailsPerson model tak, že se postava v jedné tabulce, ale každá aplikace zvětšit pole aplikace potřebuje k práci.

Je to možné?


  • EDIT 25/11/2021: zde je grafické znázornění toho, jak rád bych, aby moje modely pracovat jako

1

Já bych se osamělý. "detail" table Osoba přidání v různých app polí aplikace sama představit. Tímto způsobem můžu mít jednu tabulku s různými obory, zavedla čas od času, jak jsem se vytvořit nové aplikace do svého projektu. Je to možné? Mým cílem je mít pouze jednu tabulku.

Snažil jsem se s Nechoj je první řešení, ale declairing Osoba(modelů.Model) a pak v jiné aplikaci PsysicalModel(Osoba) přidání field_1 a field_2 a pak makemigrations a stěhovat se nechce, naplňte můj stůl s field_1 a field_2 ale listy tabulky s pouze id_person, datum narození a město.

django django-models python-3.x
2021-11-23 22:23:57
1

Nejlepší odpověď

0

Třídy, Dědičnost

Můžete použít třídy, dědičnost, stejně jako

class Person(models.Model):
    (fields)

# in other file, import this class an inherit
class PersonWithDetails(Person):
    (add. fields)

EDIT: Podle docs na multitable inheritance to bude vytvořit další tabulky pro PersonWithDetails to má další pole. Nicméně, pro uživatele to vypadá, jako by všechna data jsou uložena v jedné tabulce. Například, filtera update dotazy fungovat očekávaným způsobem:

PersonWithDetails.objects.filter(<some criteria>)

vrátí případy, které obsahují všechna pole (a to jak od Člověka a PersonWithDetails), jako v případě všech oblastech, kde uloženy v jedné tabulce PersonWithDetails. Dále je možné zvolit všechny osoby bez ohledu na jejich detaily:

Person.objects.all()

vrátí všechny Osoby, případy, včetně těch, které byly vytvořeny jako PersonWithDetails. Máte-li Osoba, například p na dosah ruky, pak můžete zkontrolovat, zda speciální atribut je přítomen, a pak vědět, zda tato instance je také PersonWithDetails:

if p.personwithdetails is not None:
    p.personwithdetails.field_1

Tento příklad ukazuje, jak přístup polí PersinWithDetails pokud instance na straně je Člověk.

OneToOneField

Další možností je použití one-to-one vztahy.

class Person(models.Model):
    (fields)

# in other file, import this class and do 
class DetailsPerson(models.Model):
    person = models.OneToOneField(Person, on_delete=models.CASCADE)
    (additional fields)

V případě přidání údaje na Osobu, třídu, raději bych druhou možnost.

ForeignKey

A pokud chcete mít několik různých Detailů tříd na jednu Osobu, použití ForeignKey:

class DetailsPerson1(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    (additional fields)

class DetailsPerson2(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    (additional fields)
2021-11-25 09:42:24

Myslel jsem, že o druhé řešení , ale takovým způsobem, budu mít několik mysql tabulky, jednu tabulku pro každý model. Mým cílem bylo, místo toho, dostat jeden několik modelů z několika aplikací, ale skupiny, všechny z nich v jedné mysql tabulce. První řešení, které jsem třeba vyzkoušet, zda to vytvoří druhý mysql tabulky, nebo ne
Soul

Dědictví nebude vytvářet několik tabulek pro základní třídy. PersonWithDetails bude Člověk stejně und můžete načíst všechny osoby z databáze s Person.objects.all() které vám také zděděné instance objektu. Vidět docs.djangoproject.com/en/3.2/topics/db/models/...
Nechoj

Nemůže dostat vaše první řešení pracovních (to loooks pro mě optimální, protože to není vytvořit další tabulky, ale aby vše kompaktní). Jednou DetailsPerson(Člověk) byl declaired v novém souboru jsem oběd makemigrations a migrovat, ale tabulka není nošení s nové pole.
Soul

Upravil jsem můj první příspěvek za účelem lepšího vysvětlení, co bych chtěl dosáhnout
Soul

Aby bylo možné vybrat nejlepší možnost, je nutné pochopit, jaký druh queries jsou povinné. Jak Django ukládá informace v tabulkách není opravdu relevantní pro tuto otázku, zda je jeden nebo dva stoly. V první možnost (dědictví), je zde jedna tabulka pro Člověka a další tabulky pro kdo má Detaily, ale uvnitř dotazů se zdá, jako by to byla organizována v jedné tabulce.
Nechoj

Ostatně mým cílem je vytvoření jednotného tabulky z různých modelů ušetřen mezi různé aplikace, takže logicky vše, co je připojen. Většina dotazů budu pracovat, jsou AKTUALIZACE nebo jednoduchý filtr().hodnoty("field_1")
Soul

Přidáno pár úprav objasnit strukturu tabulky dědictví volba
Nechoj

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................