Django

Code

Changeset 8782

Show
Ignore:
Timestamp:
08/31/08 19:49:03 (3 months ago)
Author:
mtredinnick
Message:

Fixed #8316 -- Put tighter restrictions on the type of Foreign Key fields
created for MySQL (because MySQL + InnoDB has those restrictions).
Patch from julianb.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/db/backends/__init__.py

    r8646 r8782  
    7272    can_use_chunked_reads = True 
    7373    uses_savepoints = False 
     74    # If True, don't use integer foreign keys referring to, e.g., positive 
     75    # integer primary keys. 
     76    related_fields_match_type = False 
    7477 
    7578class BaseDatabaseOperations(object): 
  • django/trunk/django/db/backends/mysql/base.py

    r8692 r8782  
    111111    empty_fetchmany_value = () 
    112112    update_can_self_select = False 
     113    related_fields_match_type = True 
    113114 
    114115class DatabaseOperations(BaseDatabaseOperations): 
  • django/trunk/django/db/models/fields/related.py

    r8756 r8782  
    685685    def contribute_to_related_class(self, cls, related): 
    686686        setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related)) 
    687          
     687 
    688688    def formfield(self, **kwargs): 
    689689        defaults = {'form_class': forms.ModelChoiceField, 'queryset': self.rel.to._default_manager.complex_filter(self.rel.limit_choices_to)} 
     
    696696        # points to an AutoField/PositiveIntegerField/PositiveSmallIntegerField, 
    697697        # in which case the column type is simply that of an IntegerField. 
     698        # If the database needs similar types for key fields however, the only 
     699        # thing we can do is making AutoField an IntegerField. 
    698700        rel_field = self.rel.get_related_field() 
    699         if isinstance(rel_field, (AutoField, PositiveIntegerField, PositiveSmallIntegerField)): 
     701        if (isinstance(rel_field, AutoField) or 
     702                (not connection.features.related_fields_match_type and 
     703                isinstance(rel_field, (PositiveIntegerField, 
     704                                       PositiveSmallIntegerField)))): 
    700705            return IntegerField().db_type() 
    701706        return rel_field.db_type() 
  • django/trunk/tests/regressiontests/model_regress/models.py

    r8526 r8782  
    3232class Event(models.Model): 
    3333    when = models.DateTimeField() 
     34 
     35class Department(models.Model): 
     36    id = models.PositiveIntegerField(primary_key=True) 
     37    name = models.CharField(max_length=200) 
     38 
     39    def __unicode__(self): 
     40        return self.name 
     41 
     42class Worker(models.Model): 
     43    department = models.ForeignKey(Department) 
     44    name = models.CharField(max_length=200) 
     45 
     46    def __unicode__(self): 
     47        return self.name 
    3448 
    3549__test__ = {'API_TESTS': """ 
     
    96110>>> e.get_previous_by_when().when 
    97111datetime.datetime(2000, 1, 1, 6, 1, 1) 
     112 
     113# Check Department and Worker 
     114>>> d = Department(id=10, name='IT') 
     115>>> d.save() 
     116>>> w = Worker(department=d, name='Full-time') 
     117>>> w.save() 
     118>>> w 
     119<Worker: Full-time> 
     120 
    98121""" 
    99122}