/ / Prečo Django vytvára migračné súbory pre proxy modely? - python, django, proxy-triedy

Prečo Django vytvára migračné súbory pre proxy modely? - python, django, proxy-triedy

Práve som vytvoril proxy model a to bolo prekvapené manage.py makemigrations vytvorí nový migračný súbor pomocou migrations.CreateModel Prevádzka.

Model proxy nevytvára novú databázovú tabuľku, je to iba odlišné rozhranie pythonu k rovnakému množstvu údajov a skutočne manage.py sqlmigrate my_app_label 0042 nevráti nič.

Myslel som si, že by sa mohol použiť na vytvorenie proxy modelu ContentType, ale tie sa vytvoria na požiadanie, ak neexistujú.

Používa sa na spustenie vytvorenia povolení modelu proxy? Je tu 6 rokov stará otvorená chyba na oprávneniach servera proxy, takže si nie som celkom istý, ako má táto časť teraz fungovať ...

To sa používalo Django 1.8 otestovať to.

editovať: objasniť, Django vytvára migráciu, ktorá pre nové modely proxy nič nerobí, takže by sme to nechceli Django nevytvoriť migráciu na prvom mieste, ak je to zbytočné?

Existuje prípad použitia, v ktorom by bolo užitočné vykonať migráciu?

odpovede:

10 pre odpoveď č. 1

Ale ak otvoríte migráciu v editore, zistíte, že je to vlastne prázdna migrácia! Tu je príklad

class Migration(migrations.Migration):
dependencies = [
("stackoverflow", "0009_auto_20160622_1507"),
]

operations = [
migrations.CreateModel(
name="MyArticle",
fields=[
],
options={
"proxy": True,
},
bases=("stackoverflow.article",),
),
]

A ak áno ./manage.py sqlmigrate myapp 0010 (čo je číslo, ktoré zodpovedá mojej migrácii vyššie), čo dostanem, je to, čo je na nasledujúcom riadku (nič)

Je to preto, že fields časť migrácie je a proxy = True, Tým sa zabráni vykonaniu akéhokoľvek SQL pre túto migráciu a pôvodná tabuľka zostane nedotknutá.

Môžete sa teda opýtať, prečo sa django obťažuje vytvoriť prázdnu migráciu? Je to preto, lebo v budúcej migrácii sa model proxy môže v budúcnosti odvolávať na iný model.


0 pre odpoveď č. 2

Verím migrations sú generované, pretože sú ovplyvnené databázy a migrations sú to, ako Django signalizuje zmenu databázy. Štruktúra sa nezmení, ale položky sa pridajú do (najmenej) dvoch tabuliek:

  • Nový ContentType je pridaný do django_content_type pre proxy model.
  • Povolenia špecifické pre Proxy model sa pridávajú do auth_permission, Predpokladám, že k tomu "vždy" dôjde, pokiaľproxy používa presne rovnaký názov triedy. Určite sa to stane - v skutočnosti používame model proxy na prístup k používateľovi pomocou rôznych povolení bez toho, aby sme sa dotkli predvoleného modelu používateľa.

Obidva tieto podrobnosti sú skutočne uvedené vreťazec komentárov k problému súvisiacemu s OP (napr. komentár č. 31), pretože prispievajú k chybe (t. j. Django hľadá povolenia v inej aplikácii, ako sú tie, ktoré sa v skutočnosti vygenerovali v auth_permissions).