Tuesday, June 28, 2011

Comparing ManyToManyFields

So I'm working on my first Django application, and I've run into a
stumbling block. In simplest terms, I've got two objects:

def Package(models.Model):
name=models.CharField(max_length=255)
version=models.CharField(max_length=128)

def Machine(models.Model):
hostname=models.CharField(max_length=255)
installed_packages=models.ManyToManyField(Package)

I'm reading in information from some file, and need to compare against
objects already in the database. Ideally, I could just create these
objects in my code, compare to the existing Django objects, and add a
new entry if it's different from anything that exists already.

However, I've got that dang ManyToManyField in there, meaning I need
to first commit a Machine to the DB, and then add Packages to it.
Otherwise, of course I get:

ValueError: 'Machine' instance needs to have a primary key value before a many-to-many relationship can be used.

This seems non-ideal, since there's a pretty good chance I'll just
need to delete it from the database as a dupe of an existing Machine.

I see a couple of ways around this:

- Instantiate a Machine and a list of Packages, and compare them
separately. This isn't ideal, as my real objects likely have more
than 1 many-to-many relationship.

- Do database queries and whatnot directly. Yuck!

- Punt and just add/remove things from the database. This would
probably work fine now, but later on could definitely lead to scaling
issues.

Am I missing an obvious solution here? I've scoured the docs and
can't seem to come up with anything that doesn't make me feel icky.

-josh

--
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