Je convertis un projet web qui utilise actuellement le Propel ORM, dans un projet django.Comment écrire cette classe pour le modèle de données de Django (conversion du format YML de Propel)
Ma première tâche est de 'porter' le schéma du modèle à django.
J'ai lu les documents django, mais ils ne semblent pas être suffisamment détaillés. comme suit le cas au point, comment peut I 'port' un (artificiel) table définie dans le schéma Propel YML:
demo_ref_country:
code: { type: varchar(4), required: true, index: unique }
name: { type: varchar(64), required: true, index: unique }
geog_region_id: { type: integer, foreignTable: demo_ref_geographic_region, foreignReference: id, required: true, onUpdate: cascade, onDelete: restrict }
ccy_id: { type: integer, foreignTable: demo_ref_currency_def, foreignReference: id, required: true, onUpdate: cascade, onDelete: restrict }
flag_image_path: { type: varchar(64), required: true, default: ''}
created_at: ~
_indexes:
idx_f1: [geog_region_id, ccy_id, created_at]
_uniques:
idxu_f1_key: [code, geog_region_id, ccy_id]
Voici mon (faible) tente jusqu'à présent:
class Country(models.Model):
code = models.CharField(max_length=4) # Erm, no index on this column .....
name = models.CharField(max_length=64) # Erm, no index on this column .....
geog_region_id = models.ForeignKey(GeogRegion) # Is this correct ? (how about ref integrity constraints ?
ccy_id = models.ForeignKey(Currency) # Is this correct?
flag_image_path = models.CharField(max_length=64) # How to set default on this col?
created_at = models.DateTimeField() # Will this default to now() ?
# Don't know how to specify indexes and unique indexes ....
[ Edit]
Pour tous ceux qui suggèrent que je RTFM, je comprends votre frustration. C'est juste que la documentation n'est pas très claire pour moi. C'est probablement une méthode de documentation Pythonienne - mais venant d'un arrière-plan C++, je pense que la documentation pourrait être améliorée pour la rendre plus accessible aux personnes venant de différentes langues. Exemple: la documentation indique simplement le nom de la classe et un paramètre ** options dans le ctor, mais ne vous dit pas quelles sont les options possibles.
Par exemple classe CharField (max_length = Aucun, [options] **)
Il y a une ligne plus haut dans la documentation qui donne une liste des options autorisées, qui sont applicables à tous les types de terrain.
Cependant, les options sont présentées sous la forme:
Field.optionname
Le lien (apparemment implicite) entre une propriété de classe et un argument de constructeur n'a pas été clair pour moi. Il semble que si une classe a une propriété foo, cela signifie que vous pouvez passer un argument nommé foo à son constructeur. Cette observation est-elle vraie pour toutes les classes Python?
Merci pour l'extrait. Je peux maintenant voir comment tout cela s'accorde. – skyeagle
existe-t-il un moyen d'appliquer RI (intégrité référentielle) sur les insertions et les suppressions (c'est-à-dire en cascade etc.), comme je le fais dans le fichier de schéma Propel YML? – skyeagle
Est-ce que unique_together est un mot-clé ?. Si oui, que se passe-t-il si vous avez plus d'un index clusterisé (clé multiple) sur une table? – skyeagle