If it receives fields from parent model, I would assume it actually has access to them. In my case, 'comment' field queried from child model returns empty while the field in parent has value. Something's definitely wrong here, I removed inheritance and created explicit OneToOne to Contact and no more monkey-business, fields are saved as expected.
On Friday, July 5, 2019 at 9:29:32 PM UTC+1, Jani Tiainen wrote: > > Hi. > > I think you have a bit confused terms model inheritance and abstract > models. > > Normal model inheritance in Django means that there will be implicit one > to one relation to base model. Inherited model still receives all fields > from parent model. On save data is just saved to correct models. To both > parent and child. And both models do have separate tables. > > If inherited model is abstract all fields are copied to inherited model > and django treats model as one. There is no parent table created but > columns are added to inheriting model table. > > pe 5. heinäk. 2019 klo 20.42 Kalev Takkis <[email protected] > <javascript:>> kirjoitti: > >> Hi all, >> >> tl;dr: saving inherited model overwrites fields in parent models with >> empty strings >> >> I have the following models: >> >> class Contact(models.Model): >> comment = models.CharField(max_length=255, blank=True) >> emails = models.ManyToManyField( >> Email, >> blank=True, >> through='ContactEmail', >> through_fields=('contact', 'email'), >> ) >> >> # couple of more manytomanys, to addresses, phones, etc >> >> >> class ContactEmail(BaseContactJunctionModel): >> email = models.ForeignKey(Email, null=True, on_delete=models.SET_NULL) >> contact = models.ForeignKey(Contact, on_delete=models.CASCADE) >> event = models.ForeignKey(ContactEvent, on_delete=models.PROTECT) >> event_date = models.DateTimeField(default=timezone.now) >> >> >> # other similar through tables for the rest of the manytomanys and their >> target models >> >> >> class Organisation(Contact): >> >> name = models.CharField(max_length=255, blank=True) >> hierarchy = models.ManyToManyField( >> 'self', >> blank=True, >> symmetrical=False, >> through='OrganisationHierarchy', >> through_fields=('sender', 'target'), >> ) >> >> # again, more manytomanys, not to self though >> >> # not sure this is relevant but as it's to self, then just in case >> class OrganisationHierarchy(BaseContactJunctionModel): >> # this, instance that specifies relationship >> sender = models.ForeignKey( >> Organisation, >> null=True, >> related_name='senders', >> on_delete=models.SET_NULL, >> ) >> >> # instance that 'this' or 'sender' is related to >> target = models.ForeignKey( >> Organisation, >> null=True, >> related_name='targets', >> on_delete=models.SET_NULL, >> ) >> >> connection_type = models.ForeignKey( >> ConnectionType, >> null=True, >> on_delete=models.PROTECT, >> ) >> >> I have a view based on CreateView and a template to capture user >> input. The post request coming from browser is a-ok, saving >> emails, contact, contactemails and other manytomany targets and >> junction tables works without a problem but when getting to >> saving Organisation, this happens (pseudocode): >> >> save() is called from django/db/models/base.py >> save_base() is called with self=Organisation >> save_base calls _save_parents(self=Organisation, cls=Organisation) >> save_parents loops through cls._meta.parents and comes across >> relation >> parent=Contact, field=Organisation.contact_ptr >> calls _save_table with self=Organisation and cls=Contact >> _save_table finds from cls._meta that it has >> local concrete field "comment" and stores it in list >> non_pks >> it then finds the values for those fields like >> this: >> f.pre_save(self, false) for f in non_pks >> >> I then see a call to _update in queries.py and Contact instance >> is updated with new values. >> >> I don't really understand what's happening here, the code finds >> local concrete fields from "cls" which at this point is Contact >> and comes up, correctly, with "comment" but then it tries to >> query the field value form "self" which at this point is >> Organisation object. I'm not sure why Organisation has "comment" >> attribute at all, because the way I read the docs it should only >> happen when the base model is abstract or when the inherited >> model is proxy model, neither of which is the case. Anyway, the >> value returned by save_base for the "comment" from "self" is not >> the value I inserted into the form field (and what has previously >> been saved to Contact object) but is instead an empty string. >> >> The end result is, after Contact object is correctly saved it is, >> moments later, overwritten by an empty string. Does anybody have >> a clue as to what is happening and most importantly, how can I >> avoid it? >> >> Thanks, >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected] <javascript:>. >> To post to this group, send email to [email protected] >> <javascript:>. >> Visit this group at https://groups.google.com/group/django-users. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/django-users/4587198f-5f6f-49a7-b54a-1dcfe5a436ab%40googlegroups.com >> >> <https://groups.google.com/d/msgid/django-users/4587198f-5f6f-49a7-b54a-1dcfe5a436ab%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/35254a5a-fb19-4550-92fc-807027a2eae9%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.

