I started composing a reply to your response, and then realized that I
had erroneously constructed a mental one-to-one model of the
relationship rather than one-to-many.  You're absolutely right, what I
was trying to do doesn't make any sense.  Whoops :)

Mike




On May 13, 2:28 pm, "Scott Moonen" <[EMAIL PROTECTED]> wrote:
> Michael, I think I understand what you're getting at, given your comment
> referring to the "unnecessary table and associated join".  I think you want
> to be able to say "ManyToOneField" in Place and have it reach back into the
> Photo model and insert a NULLable "place_id" column.  That's problematic for
> several reasons:
>
>    1. The Photo model is no longer self-contained.  You can't look at the
>    model and infer the table layout.  So, for example, you can't just syncdb 
> on
>    the Photo model's application and get the table you want.  Without 
> knowledge
>    of other applications (potentially in other projects!) you don't know what
>    the table will look like.
>    2. It produces inelegant tables at best (I'm too lazy to confirm
>    whether it actually violates any normalization rules).  If you have many
>    models referring to Photo in this way, it will have equally many columns,
>    most of which will be NULL in any case.
>
> If you want it to work this way, I think it is best that you are explicit
> about the presence of the foreign keys and code ForeignKey(x, null=True)
> within the Photo model.  But if you want the "directionality" to go the way
> you indicate, I do think it is correct and more elegant to have the
> intermediate join table.
>
>   -- Scott
>
>
>
> On Tue, May 13, 2008 at 3:41 PM, Michael Burton <[EMAIL PROTECTED]> wrote:
>
> > Sure.  OOM relationships can typically be broken down along two
> > dimensions: cardinality and directionality.
>
> > cardinality:      DIRECTIONALITY
> > ----------------------------------
> > One-to-one:       ONE-WAY, BI-WAY
> > One-to-many:      ONE-WAY, BI-WAY
> > Many-to-many:     ONE-WAY, BI-WAY
>
> > The cardinality is pretty obvious, it's just one-to-one, one-to-many,
> > or many-to-many, as we'd all expect.  Django assumes that all
> > relationships are bi-directional, meaning that if there's a
> > relationship between A and B then you can access that relationship
> > from A and you can also access it from B.
>
> > However, in some cases (like the one I originally asked the question
> > about), it's useful to have a one-way relationship, such that you can
> > access B from A, but not the other way around.  In this case, the
> > directionality would be one-way.
>
> > I'm making up all the terminology here, but hopefully the idea comes
> > across.  Django assumes bidirectionality[1], but it would be nice to
> > be able to make uni-directional relationships for those cases, like
> > Photo, where the photo can be owned by multiple different models in a
> > one-to-many way.
>
> > To keep the models clean my plan is to use your many-to-many
> > suggestion, but it does result in an unnecessary table and associated
> > join, which is a bummer but tolerable.
>
> > Thanks again,
> > Mike
>
> > [1] From
> >http://www.djangoproject.com/documentation/db-api/#how-are-the-backwa...
> > :
> > "Other object-relational mappers require you to define relationships
> > on both sides. The Django developers believe this is a violation of
> > the DRY (Don't Repeat Yourself) principle, so Django only requires you
> > to define the relationship on one end."
>
> > On May 13, 12:03 pm, "Scott Moonen" <[EMAIL PROTECTED]> wrote:
> > > Michael, can you elaborate on what you mean by "forcing bi-directional
> > > relationships"?
>
> > > The ManyToManyField approach really is, I think, the "right" way to do
> > it.
> > > If you think about it, a hypothetical ManyToOneField in your case would
> > work
> > > almost exactly like the ManyToManyField.  The join table would be
> > structured
> > > exactly the same, except it would have an additional UNIQUE(photo_id)
> > > qualifier.
>
> > >   -- Scott
>
> > > On Tue, May 13, 2008 at 2:56 PM, Michael Burton <[EMAIL PROTECTED]>
> > wrote:
>
> > > > Thanks much, Scott.  They both seem a bit hacky, but it gives me
> > > > something to work with anyway.
>
> > > > I recognize the motivation for forcing bi-directional relationships in
> > > > Django was done to keep things DRY[1], but does anyone know if there's
> > > > been any discussion about maybe relaxing this constraint?  Seems a
> > > > little restrictive, and I don't think most other web frameworks go
> > > > this route for that very reason...
>
> > > > Mike
>
> > > > [1]
> > > >http://www.djangoproject.com/documentation/db-api/#how-are-the-backwa.
> > ..
>
> > > > On May 13, 11:32 am, "Scott Moonen" <[EMAIL PROTECTED]> wrote:
> > > > > Michael, you have two alternatives:
>
> > > > >    1. Create ManyToManyField fields in the UserProfile and Place
> > models,
> > > > >    pointing to Photo.  "ManyToManyField" may seem a bit odd since
> > you
> > > > really
> > > > >    have a many-to-one relation, but it will work as you expect,
> > creating
> > > > a join
> > > > >    table connecting each pair of models.
> > > > >    2. Create two ForeignKey fields in Photo, one to UserProfile and
> > one
> > > > >    to Photo, with null=True.  Yes, this is a bit ugly. :)
>
> > > > >   -- Scott
>
> > > > > On Tue, May 13, 2008 at 2:24 PM, Michael Burton <[EMAIL PROTECTED]>
> > > > wrote:
>
> > > > > > I have some Places and I have some Users in my database.  I'd like
> > to
> > > > > > be able to associate some Photos with each.
>
> > > > > >  class Photo(models.Model):
> > > > > >    # a model that represents a photo
>
> > > > > >  class UserProfile(models.Model):
> > > > > >    # has a list of Photos
>
> > > > > >  class Place(models.Model):
> > > > > >    # has a list of Photos
>
> > > > > > Normally, if i were using another ORM framework, I would make my
> > Place
> > > > > > have a list of photos, and I'd make my UserProfile have a list of
> > > > > > photos, and I'd leave my Photo model alone.  However, the Django
> > way
> > > > > > of doing things requires that I put a ForeignKey into my Photo
> > model
> > > > > > to establish the one-to-many.
>
> > > > > > The problem is, sometimes Photo's ForeignKey will point to a
> > > > > > UserProfile and sometimes to an Place.  How can I have both my
> > > > > > UserProfile and Place models point to Photos?
>
> > > > > > Thanks in advance,
> > > > > > Mike
>
> > > > > --http://scott.andstuff.org/|http://truthadorned.org/<http://scott.andstuff.org/%7Chttp://truthadorned.org/>
> > <http://scott.andstuff.org/%7Chttp://truthadorned.org/>
>
> > > --http://scott.andstuff.org/|http://truthadorned.org/<http://scott.andstuff.org/%7Chttp://truthadorned.org/>
>
> --http://scott.andstuff.org/|http://truthadorned.org/
--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to