Django

Code

Changeset 4752

Show
Ignore:
Timestamp:
03/19/07 06:57:53 (1 year ago)
Author:
russellm
Message:

Fixed #3741 -- Fixed serialization of GenericRelations?. Thanks for the report, Alexander Solovyov.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/core/serializers/base.py

    r4718 r4752  
    3535            self.start_object(obj) 
    3636            for field in obj._meta.fields: 
    37                 if field is obj._meta.pk: 
    38                     continue 
    39                 elif field.rel is None: 
     37                if field.serialize: 
     38                    if field.rel is None: 
     39                        if self.selected_fields is None or field.attname in self.selected_fields: 
     40                            self.handle_field(obj, field) 
     41                    else: 
     42                        if self.selected_fields is None or field.attname[:-3] in self.selected_fields: 
     43                            self.handle_fk_field(obj, field) 
     44            for field in obj._meta.many_to_many: 
     45                if field.serialize: 
    4046                    if self.selected_fields is None or field.attname in self.selected_fields: 
    41                         self.handle_field(obj, field) 
    42                 else: 
    43                     if self.selected_fields is None or field.attname[:-3] in self.selected_fields: 
    44                         self.handle_fk_field(obj, field) 
    45             for field in obj._meta.many_to_many: 
    46                 if self.selected_fields is None or field.attname in self.selected_fields: 
    47                     self.handle_m2m_field(obj, field) 
     47                        self.handle_m2m_field(obj, field) 
    4848            self.end_object(obj) 
    4949        self.end_serialization() 
  • django/trunk/django/db/models/fields/generic.py

    r4265 r4752  
    9595        kwargs['blank'] = True 
    9696        kwargs['editable'] = False 
     97        kwargs['serialize'] = False 
    9798        Field.__init__(self, **kwargs) 
    9899 
  • django/trunk/django/db/models/fields/__init__.py

    r4724 r4752  
    6868    def __init__(self, verbose_name=None, name=None, primary_key=False, 
    6969        maxlength=None, unique=False, blank=False, null=False, db_index=False, 
    70         core=False, rel=None, default=NOT_PROVIDED, editable=True, 
     70        core=False, rel=None, default=NOT_PROVIDED, editable=True, serialize=True, 
    7171        prepopulate_from=None, unique_for_date=None, unique_for_month=None, 
    7272        unique_for_year=None, validator_list=None, choices=None, radio_admin=None, 
     
    7979        self.core, self.rel, self.default = core, rel, default 
    8080        self.editable = editable 
     81        self.serialize = serialize 
    8182        self.validator_list = validator_list or [] 
    8283        self.prepopulate_from = prepopulate_from 
  • django/trunk/django/db/models/options.py

    r4265 r4752  
    8585            if not self.pk and field.primary_key: 
    8686                self.pk = field 
     87                field.serialize = False 
    8788 
    8889    def __repr__(self): 
  • django/trunk/tests/regressiontests/serializers_regress/models.py

    r4719 r4752  
    77 
    88from django.db import models 
    9      
     9from django.contrib.contenttypes.models import ContentType 
     10 
    1011# The following classes are for testing basic data  
    1112# marshalling, including NULL values. 
     
    7374class XMLData(models.Model): 
    7475    data = models.XMLField(null=True) 
     76     
     77class Tag(models.Model): 
     78    """A tag on an item.""" 
     79    data = models.SlugField() 
     80    content_type = models.ForeignKey(ContentType) 
     81    object_id = models.PositiveIntegerField() 
     82 
     83    content_object = models.GenericForeignKey() 
     84 
     85    class Meta: 
     86        ordering = ["data"] 
     87 
     88class GenericData(models.Model): 
     89    data = models.CharField(maxlength=30) 
     90 
     91    tags = models.GenericRelation(Tag) 
    7592     
    7693# The following test classes are all for validation 
  • django/trunk/tests/regressiontests/serializers_regress/tests.py

    r4724 r4752  
    2525    instance.save()     
    2626    return instance 
     27 
     28def generic_create(pk, klass, data): 
     29    instance = klass(id=pk) 
     30    instance.data = data[0] 
     31    instance.save() 
     32    for tag in data[1:]: 
     33        instance.tags.create(data=tag) 
     34    return instance 
    2735     
    2836def fk_create(pk, klass, data): 
     
    5765                         "Objects with PK=%d not equal; expected '%s' (%s), got '%s' (%s)" % (pk,data, type(data), instance.data, type(instance.data))) 
    5866 
     67def generic_compare(testcase, pk, klass, data): 
     68    instance = klass.objects.get(id=pk) 
     69    testcase.assertEqual(data[0], instance.data) 
     70    testcase.assertEqual(data[1:], [t.data for t in instance.tags.all()]) 
     71     
    5972def fk_compare(testcase, pk, klass, data): 
    6073    instance = klass.objects.get(id=pk) 
     
    7790# and one to compare objects of that type 
    7891data_obj = (data_create, data_compare) 
     92generic_obj = (generic_create, generic_compare) 
    7993fk_obj = (fk_create, fk_compare) 
    8094m2m_obj = (m2m_create, m2m_compare) 
     
    141155    (data_obj, 191, XMLData, None), 
    142156 
     157    (generic_obj, 200, GenericData, ['Generic Object 1', 'tag1', 'tag2']), 
     158    (generic_obj, 201, GenericData, ['Generic Object 2', 'tag2', 'tag3']), 
     159 
    143160    (data_obj, 300, Anchor, "Anchor 1"), 
    144161    (data_obj, 301, Anchor, "Anchor 2"), 
     
    223240    transaction.leave_transaction_management() 
    224241 
     242    # Add the generic tagged objects to the object list  
     243    objects.extend(Tag.objects.all()) 
     244     
    225245    # Serialize the test database 
    226246    serialized_data = serializers.serialize(format, objects, indent=2)