Reputation: 59
I'm trying to serialize my model to JSON to be passed to a JavaScript function. When I serialize the model it returns everything fine except for the foreign keys. They return the numeric primary key in the JSON.
models.py
class NameManager(models.Manager):
def get_by_natural_key(self,
first_name,
middle_name,
last_name):
return self.get(
first_name=first_name,
middle_name=middle_name,
last_name=last_name)
class Name(models.Model):
"""Name model - contains properties for Name"""
objects = NameManager()
first_name = models.CharField(max_length=200)
middle_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
def natural_key(self):
return(self.first_name,
self.middle_name,
self.last_name,)
class Meta:
unique_together = ((
'first_name',
'middle_name',
'last_name'),)
class SponsorManager(models.Manager):
def get_by_natural_key(self,
sponsor_name,
sponsor_email,
sponsor_phone,
sponsor_address):
return self.get(
sponsor_name=sponsor_name,
sponsor_email=sponsor_email,
sponsor_phone=sponsor_phone,
sponsor_address=sponsor_address)
class Sponsor(models.Model):
"""Sponser model - contains properties for Sponsor"""
objects = SponsorManager()
sponsor_name = models.ForeignKey(Name)
sponsor_email = models.EmailField(default='Please enter')
sponsor_phone = models.IntegerField(default=0000000)
sponsor_address = models.ForeignKey(Address)
def natural_key(self):
return(self.sponsor_name,
self.sponsor_email,
self.sponsor_phone,
self.sponsor_address)
class Show(models.Model):
"""Show model - contains properties for Shows"""
BOX_CHOICES = (
('box', 'BOX'),
('gred', 'GRED'),
('boxgred', 'BOX/GRED'))
show_date = models.DateField()
show_time = models.TimeField(default=datetime.now())
show_type = models.CharField(
choices=BOX_CHOICES,
default='box',
max_length=8)
show_box_total = models.IntegerField(default=0)
show_address = models.ForeignKey(
Address,
related_name='show_address')
show_sponsor = models.ForeignKey(
Sponsor,
default=1,
related_name='show_sponser')
views.py
def dashboard_view(request):
"""render the admin view"""
get_all_shows = Show.objects.all().order_by('show_date')
json_shows = serializers.serialize('json', get_all_shows)
print (json_shows)
context = {
'json_shows': json_shows
}
return render(
request,
'website/dashboard_view.html',
context)
As you can see I've tried using natural keys, but with the same results. I could be approaching this all wrong to begin with and advice in a more correct approach would be great.
Upvotes: 0
Views: 813
Reputation: 19831
json_shows = serializers.serialize('json', get_all_shows, use_natural_foreign_keys=True)
As stated in the documentation, you will need to specify use_natural_foreign_keys=True
while serializing.
When
use_natural_foreign_keys=True
is specified, Django will use thenatural_key()
method to serialize any foreign key reference to objects of the type that defines the method.
Upvotes: 1