2013-07-12 2 views
1

Мне любопытно о конвенции в Django. Возможно, я полностью отстал отсюда, но мне кажется, что ForeignKey часто может заменить необходимость определения собственного пользовательского поля в Django.Зарубежный ключ против пользовательского поля в Django

Например, это то, что мой код выглядит как сейчас,

class MyObject(models.Model): 
    object_type = models.ForeignKey(Object_Type) 


class Object_Type(models.Model): 
    value = models.CharField(max_length=20) 

Может это не заменить чем-то вроде этого?

class MyObject(models.Model): 
    object_type = models.CustomField() 

Где настраиваемое поле является полем я определил, что охватывает все, скажем, 10 типов объектов я мог бы иметь. Каков наилучший способ между этими двумя?

+0

Для этого примера я бы рекомендовал подход 'ForeignKey', поскольку у вас есть все, что вам предназначено. – karthikr

+0

Предполагаю, что я делаю это так ... Так как я знаю, что у меня всего 10 объектов object_types, я бы просто предварительно заполнил базу данных этими десятью значениями и не позволял пользователям добавлять/удалять из этой таблицы? Каков наилучший способ сделать это и будет ли customField позволять мне НЕ делать это? – FrancescoA

ответ

1

Да, вы можете использовать ForeignKey как свой собственный CustomField. Это не было в Django models (то есть вы не могли использовать models.CustomField()). Вместо этого вы использовали бы свое собственное имя класса, и это было бы subclassmodels.Field

Непонятно, как вы будете обрабатывать смешанные типы (например, int, float и т. Д.). Вам нужно будет преобразовать их в общее представление, например, в строку.

Другой вариант - объявить класс объекта и запросить соответствующую модель. Например, если у вас:

class MyModel(models.Model): 
    object_class = models.CharField(max_length=10) 

class Object20(models.Model): 
    mymodel = models.ForeignKey(MyModel) 
    value = models.CharField(max_length=20) 

, то вы могли бы написать:

m = MyModel.objects.get(pk=1) 
if m.object_class == 'Object20': 
    o = Object20.objects.filter(mymodel=m).get() 
    value = o.value 

Django предоставляет contenttypes framework, но я не рекомендую. Один запрос может блокировать несколько таблиц базы данных. Однако он решает проблему, которую вы описываете.

Смежные вопросы