Tuesday, September 28, 2010

Re: Bug in model inheritance?

Alec,

Thanks.. yeah, your fix forces the fields to pk=True, which doesn't
redundantly serialize the field with it's custom name in my case. If
for some reason you wanted to ensure that the field was serialized
using it's custom field name though.. there doesn't appear to be a way
to do that. I'm pretty convinced this is a bug.

Phill

On Sep 28, 11:12 am, Alec Shaner <asha...@chumpland.org> wrote:
> As to whether it's a bug or not I have no idea, though it seems so.
>
> If you use:
>
>     entity = models.OneToOneField(Entity, parent_link=True, primary_key=True)
>
> it will create the primary key in both Kid and Adult tables, which
> sounds like what you want?
>
>
>
> On Tue, Sep 28, 2010 at 1:06 PM, phill <famousactr...@gmail.com> wrote:
> > This looks quite a bit like a bug, but we may be off the reservation
> > in terms of how we're using the product. (Disclaimer: I'm relatively
> > new to Django, and extremely new to the codebase that I ran into this
> > on).
>
> > We've got a form of schema-inheritance going on in this project in
> > order to accomplish shared-id-space and the ability to relate models
> > to one of a number of different types. The way that we've broken it
> > out runs us into a strange inconsistency in Django that specifically
> > affects our ability to serialize the objects. Here's a simplified
> > version of what we're doing:
>
> > class Entity(models.Model):
> >    entityType = models.CharField(editable=False,max_length=50)
>
> >    def __init__(self, *args, **kwargs):
> >        super(Entity, self).__init__(*args, **kwargs)
> >        self.entityType = self.__class__.__name__
>
> >    def __unicode__(self):
> >        return 'Entity: %s %s' %(self.entityType, self.id)
>
> > class BasePerson(Entity):
>
> >    entity = models.OneToOneField(Entity, parent_link=True)
> >    name = models.CharField(max_length=50)
>
> >    class Meta:
> >        abstract = True
>
> > class Kid(BasePerson):
> >    school = models.CharField(max_length=50)
>
> > class Adult(BasePerson):
> >    job = models.CharField(max_length=50)
>
> > When I dump instances of these models out using the standard fixtures
> > serialization, instances of Kid will serialize the 'entity' field, but
> > instances of Adult won't. The reason is because Adult's entity field
> > is marked primaryKey=True. Kid's is not. There appears to be a caching
> > issue here, because if I swap the order that Kid and Adult are defined
> > in.. the error reverses (now Kid's field will be marked pk).
>
> > Is this a bug? If not, what's the reasoning behind this behavior? Is
> > there a better pattern for accomplishing this kind of inheritance?
>
> > Thanks in advance for your help.
>
> > Phill
>
> > --
> > You received this message because you are subscribed to the Google Groups "Django users" group.
> > To post to this group, send email to django-users@googlegroups.com.
> > To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
> > For more options, visit this group athttp://groups.google.com/group/django-users?hl=en.

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to django-users+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.

No comments:

Post a Comment