3

I have two django models like these:

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

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

I had previously created a Place instance, like this:

sixth_ave_street_vendor = Place(name='Bobby Hotdogs', address='6th Ave')
sixth_ave_street_vendor.save()

Now bobby has upgraded his street vendor to a restaurant. How can I do that in my code?! Why this code doesn't work:

sixth_ave_restaurant = Restaurant(place=sixth_ave_street_vendor,
                                  serves_hot_dogs=True,
                                  serves_pizza=True)
sixth_ave_restaurant.save()

2 Answers 2

5

Here is my workaround:

sixth_ave_restaurant = Restaurant(place_ptr=sixth_ave_street_vendor,
                                  serves_hot_dogs=True,
                                  serves_pizza=True)
sixth_ave_restaurant.save_base(raw=True)

And if you want to do something else with sixth_ave_restaurant, you should get it again, because its id is not assigned yet, as it gets assigned after normal save():

sixth_ave_restaurant = Restaurant.objects.get(id=sixth_ave_street_vendor.id)
Sign up to request clarification or add additional context in comments.

Comments

3

You should use place_ptr instead of place.

restaurant = Restaurant.objects.create(place_ptr=sixth_ave_street_vendor,
                                       serves_hot_dogs=True, serves_pizza=True)

3 Comments

I Set both place_ptr and place_ptr_id, but django still tries to insert a new Place :(
@RezaMohammadi that might be because sixth_ave_street_vendor is not yet saved, and looking into your code you haven't called the save method sixth_ave_street_vendor.save()
Here is another way: Create a model that called BasePlace, and extend the other models with that model.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.