2010-07-04 9 views
3

J'ai un code qui suit l'exemple pour l'héritage multi-table comme indiqué sur la page de documentation: http://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance. Ce que j'essaye de faire est de créer un restaurant autour d'un endroit.Django Multi-Table héritage et la création de modèle

je l'ai déjà créé un endroit, et je veux faire un restaurant comme si:

>>> p = Place.objects.get(id=12) 
# If p is a Restaurant object, this will give the child class: 
>>> p.restaurant 
<Restaurant: ...> 
>>> r = Restaurant(p) 

mais je reçois juste cette erreur:

TypeError: int() argument must be a string or a number, not 'Place' 

Je veux ajouter plus informations à mes modèles, donc je ne veux pas entrer et manuellement définir tous les champs pour être égaux. Est-ce qu'il y a un moyen de faire ça?

Répondre

1

Je pense que vous devez ajouter une clé étrangère Restaurant comme ceci:

class Place(models.Model): 
    name = models.CharField(max_length=50) 
    address = models.CharField(max_length=80) 

class Restaurant(models.Model): 
    place = models.ForeignKey(Place) 
    serves_hot_dogs = models.BooleanField() 
    serves_pizza = models.BooleanField() 

et vous pouvez le faire:

>>> p = Place.objects.get(id=12) 
>>> r = Restaurant(place=p) 
+1

héritage du modèle ajoute une OneToOne implicite de l'enfant au parent. Mais tu es proche. –

3

Malheureusement modèle "promotion" comme celui-ci est problématique. La bonne façon est de créer un nouvel objet Restaurant en copiant les champs de Place. Vous devez faire cela en parcourant Place._meta.get_fields_with_model() et en voyant le modèle auquel les champs appartiennent. Je ne peux pas vous donner le code exact pour cela, mais si vous pouvez vivre avec du code GPL, alors c'est transifex.txcommon.models depuis la révision bcd274ce7815.

+0

une chance que vous pouvez fournir un lien vers quelque part? – Fred

+0

http://code.transifex.org/index.cgi/mainline/file/a9f391a5c9b8/transifex/txcommon/models.py#l62 – zellyn

1

J'ai rencontré le même problème. Je pense avoir trouvé une bonne solution:

je définissais mon modèle de restaurant en utilisant trois classes comme ceci:

class RestaurantBase(models.Model): 
    class Meta: 
     abstract = True 
    serves_hot_dogs = models.BooleanField(default=False) 
    serves_pizza = models.BooleanField(default=False) 

class Restaurant(Place, RestaurantBase): 
    pass 

class RestaurantStandalone(RestaurantBase): 
    class Meta: 
     managed = False 
     db_table = Restaurant._meta.db_table 
    place_ptr = models.OneToOneRelationship(Place) 

Maintenant, si j'ai un endroit que je veux passer à un restaurant, je ne ce qui suit:

p = Places.objects.get(id=3) 
r = RestaurantStandalone() 
r.place_ptr = p 
r.save() 

maintenant votre place est un restaurant

r = Restaurant.objects.filter(place_ptr=p) 
print(r.id) 
>>3 
0

Comme je l'ai répondu m y propre question here,

J'ai fini par faire quelque chose le long des lignes de

p = Place.objects.get(name="Bob's Cafe") 
Restaurant.objects.create(
    place_ptr = p.id, 
    serves_hot_dogs = True, 
    serves_pizza = False 
) 
Questions connexes