2014-09-09 4 views
1

Я создаю класс в Django's models.py. Когда я создаю второй класс, где у меня есть внешний ключ от первого класса. Ключ «1» или «2» или ...Django возвращает определенное поле из модели как внешний ключ

Интересно, можете ли вы настроить Django для использования определенного поля для использования в качестве ключа.

Например:

class Customer(models.Model): 
    name = models.CharField(max_length=64) 
    myid = models.CharField(max_length=64) 

class Setting(models.Model): 
    owner = models.ForeignKey(Customer) 
    ... 

Тогда У меня есть мнение

def getsetting(request): 
    response = serializers.serialize('json', Setting.objects.all()) 
    return HttpResponse(response, content_type='json') 

JSON, возвращаемые шоу "1", "2", ... как ключ для поля "владельца".

Так что мой вопрос в том, можно ли использовать «имя» или «мид» в качестве внешнего ключа? Или есть простой способ переписать это поле в json?

Спасибо!

ответ

1

«Если вы хотите указать настраиваемый первичный ключ, просто укажите primary_key = True в одном из полей». https://docs.djangoproject.com/en/1.4/topics/db/models/#automatic-primary-key-fields

Таким образом, вы можете изменить свой класс Customer:

class Customer(models.Model): 
    name = models.CharField(max_length=64) 
    myid = models.CharField(primary_key=True, max_length=64) 
+0

Действительно простой способ! Спасибо! – dome12b

1

Взгляните на сериализации с естественными ключами. Вы можете прочитать официальные документы здесь: https://docs.djangoproject.com/en/1.7/topics/serialization/#natural-keys

Это довольно просто, добавить метод к классу:

class Customer(models.Model): 
    name = models.CharField(max_length=64) 
    myid = models.CharField(max_length=64) 

    def natural_key(self): 
     return (self.myid,) 

А затем сериализовать с use_natural_foreign_keys=True:

def getsetting(request): 
    response = serializers.serialize('json', Setting.objects.all(), 
            use_natural_foreign_keys=True) 
    return HttpResponse(response, content_type='json')