Django

Code

Changeset 6264

Show
Ignore:
Timestamp:
09/15/07 00:32:29 (8 months ago)
Author:
russellm
Message:

Fixed #4714 -- Modified serializers to handle None primary keys correctly. This slightly changes the output format for primary keys on JSON and YAML serializers (PKs will be output as 1, rather than "1". However, fixtures in the old format will still load ok. Thanks for the patch, pigletto.

Files:

Legend:

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

    r5609 r6264  
    2828        self.objects.append({ 
    2929            "model"  : smart_unicode(obj._meta), 
    30             "pk"     : smart_unicode(obj._get_pk_val()), 
     30            "pk"     : smart_unicode(obj._get_pk_val(), strings_only=True), 
    3131            "fields" : self._current 
    3232        }) 
     
    3434 
    3535    def handle_field(self, obj, field): 
    36         self._current[field.name] = getattr(obj, field.name) 
     36        self._current[field.name] = smart_unicode(getattr(obj, field.name), strings_only=True) 
    3737 
    3838    def handle_fk_field(self, obj, field): 
     
    4545                # Related to remote object via other field 
    4646                related = getattr(related, field.rel.field_name) 
    47         self._current[field.name] = related 
     47        self._current[field.name] = smart_unicode(related, strings_only=True) 
    4848 
    4949    def handle_m2m_field(self, obj, field): 
    50         self._current[field.name] = [related._get_pk_val() for related in getattr(obj, field.name).iterator()] 
     50        self._current[field.name] = [smart_unicode(related._get_pk_val(), strings_only=True) 
     51                           for related in getattr(obj, field.name).iterator()] 
    5152 
    5253    def getvalue(self): 
  • django/trunk/tests/modeltests/fixtures/models.py

    r5915 r6264  
    7575# Dump the current contents of the database as a JSON fixture 
    7676>>> management.call_command('dumpdata', 'fixtures', format='json') 
    77 [{"pk": "3", "model": "fixtures.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": "2", "model": "fixtures.article", "fields": {"headline": "Poker has no place on ESPN", "pub_date": "2006-06-16 12:00:00"}}, {"pk": "1", "model": "fixtures.article", "fields": {"headline": "Python program becomes self aware", "pub_date": "2006-06-16 11:00:00"}}] 
     77[{"pk": 3, "model": "fixtures.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": 2, "model": "fixtures.article", "fields": {"headline": "Poker has no place on ESPN", "pub_date": "2006-06-16 12:00:00"}}, {"pk": 1, "model": "fixtures.article", "fields": {"headline": "Python program becomes self aware", "pub_date": "2006-06-16 11:00:00"}}] 
    7878"""} 
    7979 
  • django/trunk/tests/modeltests/serializers/models.py

    r5876 r6264  
     1# -*- coding: utf-8 -*- 
    12""" 
    2341. Serialization 
     
    4445    def __unicode__(self): 
    4546        return u"Profile of %s" % self.author 
     47         
     48class Actor(models.Model): 
     49    name = models.CharField(max_length=20, primary_key=True) 
     50 
     51    class Meta: 
     52        ordering = ('name',) 
     53     
     54    def __unicode__(self): 
     55        return self.name 
     56     
     57class Movie(models.Model): 
     58    actor = models.ForeignKey(Actor) 
     59    title = models.CharField(max_length=50) 
     60 
     61    class Meta: 
     62       ordering = ('title',) 
     63 
     64    def __unicode__(self): 
     65        return self.title 
    4666 
    4767__test__ = {'API_TESTS':""" 
     
    102122>>> json = serializers.serialize("json", Category.objects.filter(pk=2)) 
    103123>>> json 
    104 '[{"pk": "2", "model": "serializers.category", "fields": {"name": "Music"}}]' 
     124'[{"pk": 2, "model": "serializers.category", "fields": {"name": "Music"}}]' 
    105125 
    106126# You can easily create new objects by deserializing data with an empty PK 
     
    134154>>> json = serializers.serialize("json", AuthorProfile.objects.all()) 
    135155>>> json 
    136 '[{"pk": "1", "model": "serializers.authorprofile", "fields": {"date_of_birth": "1970-01-01"}}]' 
     156'[{"pk": 1, "model": "serializers.authorprofile", "fields": {"date_of_birth": "1970-01-01"}}]' 
    137157 
    138158>>> for obj in serializers.deserialize("json", json): 
     
    142162# Objects ids can be referenced before they are defined in the serialization data 
    143163# However, the deserialization process will need to be contained within a transaction 
    144 >>> json = '[{"pk": "3", "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00", "categories": [4, 1], "author": 4}}, {"pk": "4", "model": "serializers.category", "fields": {"name": "Reference"}}, {"pk": "4", "model": "serializers.author", "fields": {"name": "Agnes"}}]' 
     164>>> json = '[{"pk": 3, "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00", "categories": [4, 1], "author": 4}}, {"pk": 4, "model": "serializers.category", "fields": {"name": "Reference"}}, {"pk": 4, "model": "serializers.author", "fields": {"name": "Agnes"}}]' 
    145165>>> from django.db import transaction 
    146166>>> transaction.enter_transaction_management() 
     
    162182# Serializer output can be restricted to a subset of fields 
    163183>>> print serializers.serialize("json", Article.objects.all(), fields=('headline','pub_date')) 
    164 [{"pk": "1", "model": "serializers.article", "fields": {"headline": "Just kidding; I love TV poker", "pub_date": "2006-06-16 11:00:00"}}, {"pk": "2", "model": "serializers.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": "3", "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00"}}] 
     184[{"pk": 1, "model": "serializers.article", "fields": {"headline": "Just kidding; I love TV poker", "pub_date": "2006-06-16 11:00:00"}}, {"pk": 2, "model": "serializers.article", "fields": {"headline": "Time to reform copyright", "pub_date": "2006-06-16 13:00:00"}}, {"pk": 3, "model": "serializers.article", "fields": {"headline": "Forward references pose no problem", "pub_date": "2006-06-16 15:00:00"}}] 
     185 
     186# Every string is serialized as a unicode object, also primary key  
     187# which is 'varchar' 
     188>>> ac = Actor(name="ZaŌółć") 
     189>>> mv = Movie(title="GęślÄ 
     190 jaźń", actor=ac) 
     191>>> ac.save(); mv.save() 
     192 
     193# Let's serialize our movie 
     194>>> print serializers.serialize("json", [mv]) 
     195[{"pk": 1, "model": "serializers.movie", "fields": {"actor": "Za\u017c\u00f3\u0142\u0107", "title": "G\u0119\u015bl\u0105 ja\u017a\u0144"}}] 
     196 
     197# Deserialization of movie 
     198>>> list(serializers.deserialize('json', serializers.serialize('json', [mv])))[0].object.title 
     199u'G\u0119\u015bl\u0105 ja\u017a\u0144' 
     200 
     201# None is null after serialization to json 
     202# Primary key is None in case of not saved model 
     203>>> mv2 = Movie(title="Movie 2", actor=ac) 
     204>>> print serializers.serialize("json", [mv2]) 
     205[{"pk": null, "model": "serializers.movie", "fields": {"actor": "Za\u017c\u00f3\u0142\u0107", "title": "Movie 2"}}] 
     206 
     207# Deserialization of null returns None for pk 
     208>>> print list(serializers.deserialize('json', serializers.serialize('json', [mv2])))[0].object.id 
     209None 
    165210 
    166211"""}