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ď č. 1Ale 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ý dodjango_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
).