I've just upgraded from a very old version of Django (1.4) up to 1.7.8, and 
some behaviour isn't how I expect.  I may have missed something - I've not 
been keeping an eye on the framework changes.

Two models, Venue and VenueAlias.  VenueAlias has a ForeignKey to Venue, 
one venue has many VenueAliases. (Full models pasted below.)

My problem is with accessing venuealias_set on my Venue, it doesn't seem to 
be limiting to Venue how it used to in the earlier version.

Here's an interactive session that shows the problem.  Venue 5854 has three 
aliases.

>>> from bbr.contests.models import Venue
>>> lVenue = Venue.objects.filter(id=5854)[0]
>>> lVenue
<Venue: Royal Northern College of Music (Haden Freeman Concert Hall), 
Manchester, Greater Manchester, England, UK>
>>> lVenue.exact
False
>>> lAliases = lVenue.venuealias_set.all()
>>> len(lAliases)
402
>>> print lAliases.query
SELECT "venues_venuealias"."id", "venues_venuealias"."last_modified", 
"venues_venuealias"."created", "venues_venuealias"."name", 
"venues_venuealias"."alias_start_date", 
"venues_venuealias"."alias_end_date", "venues_venuealias"."venue_id", 
"venues_venuealias"."lastChangedBy_id", "venues_venuealias"."owner_id" FROM 
"venues_venuealias" INNER JOIN "contests_venue" ON ( 
"venues_venuealias"."venue_id" = "contests_venue"."id" ) WHERE 
"contests_venue"."exact" = True ORDER BY "venues_venuealias"."name" ASC

Where's the SQL to limit by the foreign key to venue.id=5854?  Why is there 
a reference in here to contests_venue.exact?

Approaching the same problem from the other direction works fine, and I get 
the correct number of aliases returned.

>>> from bbr.venues.models import VenueAlias
>>> lVenueAliases = VenueAlias.objects.filter(venue_id=5854)
>>> len(lVenueAliases)
3
>>> print lVenueAliases.query
SELECT "venues_venuealias"."id", "venues_venuealias"."last_modified", 
"venues_venuealias"."created", "venues_venuealias"."name", 
"venues_venuealias"."alias_start_date", 
"venues_venuealias"."alias_end_date", "venues_venuealias"."venue_id", 
"venues_venuealias"."lastChangedBy_id", "venues_venuealias"."owner_id" FROM 
"venues_venuealias" WHERE "venues_venuealias"."venue_id" = 5854 ORDER BY 
"venues_venuealias"."name" ASC

On my old server, running the old django 1.4 code, both these approaches 
work as expected.  Venue and VenueAlias are actually in different models.py 
files, for historical reasons.

What have I missed?  Thanks for any input/education!

Tim.


class VenueAlias(models.Model):
    """
    An alias for a venue
    """
    last_modified = 
models.DateTimeField(default=datetime.now,editable=False)
    created = models.DateTimeField(default=datetime.now,editable=False)
    name = models.CharField(max_length=200, help_text='Name of Venue Alias')
    alias_start_date = models.DateField(blank=True, null=True, 
help_text="Start date for this alias (yyyy-mm-dd)")
    alias_end_date = models.DateField(blank=True, null=True, help_text="End 
date for this alias (yyyy-mm-dd)")
    venue = models.ForeignKey(Venue)
    lastChangedBy = models.ForeignKey(User, editable=False, 
related_name='VenueAliasLastChangedBy')
    owner = models.ForeignKey(User, editable=False, 
related_name='VenueAliasOwner')
    
    def save(self):
        self.last_modified = datetime.now()
        super(VenueAlias, self).save()
        
    def show_start_date(self):
        """
        Return true if start date is recent enough to make sense
        """
        lCutOffDate = date(year=1700, month=1, day=1)
        print lCutOffDate
        print self.alias_start_date
        if self.alias_start_date > lCutOffDate:
            return True
        return False
     
    @property
    def slug(self):
        return self.venue.slug
    
    def __unicode__(self):
        return "%s -> %s" % (self.name, self.venue.name)
    
    class Meta:
        ordering = ['name']
        verbose_name_plural = 'Venue aliases'


class Venue(models.Model):
    """
    A venue for a contest
    """
    last_modified = 
models.DateTimeField(default=datetime.now,editable=False)
    created = models.DateTimeField(default=datetime.now,editable=False)
    name = models.CharField(max_length=255)
    slug = models.SlugField()
    country = models.ForeignKey(Region, blank=True, null=True)
    latitude = models.CharField(max_length=15, blank=True, null=True)
    longitude = models.CharField(max_length=15, blank=True, null=True)
    point = geomodels.PointField(dim=3, geography=True, blank=True, 
null=True, editable=False)
    postcode = models.CharField(max_length=10, blank=True, null=True)
    exact = models.BooleanField(default=False, help_text="True if latitude 
and longitude is for a building, rather than a town")
    mapper = models.ForeignKey(User, editable=False, 
related_name='VenueMapper', blank=True, null=True)
    parent = models.ForeignKey("Venue", blank=True, null=True)
    notes = models.TextField(blank=True, null=True)
    lastChangedBy = models.ForeignKey(User, editable=False, 
related_name='VenueLastChangedBy')
    owner = models.ForeignKey(User, editable=False, 
related_name='VenueOwner')
        
    def __unicode__(self):
        return "%s" % (self.name)
    
    def asJson(self):
        lDict = {
                 'id' : self.id,
                 'name' : self.name,
                 }
        return json.dumps(lDict)
    
    def venue_name(self, pDateOfEvent):
        """
        Return venue name, or alias name if there is an alias for the date 
specified
        """
        try:
            lAliasMatch = 
self.venuealias_set.filter(alias_start_date__lte=pDateOfEvent, 
alias_end_date__gte=pDateOfEvent)[0]
            return lAliasMatch.name
        except IndexError:
            return self.name
    
    def save(self):
        if self.latitude != None and len(self.latitude) > 0 and 
self.longitude != None and len(self.longitude) > 0:
            lString = 'POINT(%s %s)' % (self.longitude.strip(), 
self.latitude.strip())
            self.point = fromstr(lString)
        self.last_modified = datetime.now()
        super(Venue, self).save()
    
    class Meta:
        ordering = ['name']   

-- 
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 django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/e4359090-6a50-406a-82dd-8b8f6ca9cf4d%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to