2013-02-19 3 views
2

В моей модели первичного класса Сделки у меня есть определенные поля как описание, цена, дата_created и т. Д. Теперь мне нужно добавить некоторые поля, имеющие подполя. Например, я пытаюсь добавить поле Возраста к Сделки. В этом возрастном поле также есть подполя (например, score_for_kid, score_for_baby, score_for_old и т. Д.), И я хочу отредактировать эти оценки от администратора.Django: подполя в поле модели

Вот мой models.py:

class Deals(models.Model): 
    description = models.TextField() 
    price = models.DecimalField(max_digits=7, decimal_places=2) 
    url = models.URLField(verify_exists=False) 
    currency = models.CharField(max_length=3) 
    created_date = models.DateField(auto_now_add=True) 

    kid_score = models.IntegerField(max_length=2,default=0) 
    teenager_score = models.IntegerField(max_length=2,default=0) 
    youth_score = models.IntegerField(max_length=2,default=0) 
    old_score = models.IntegerField(max_length=2,default=0) 

Я не хочу, чтобы хранить все эти подпункты поля (около 20-25 в 4 различных областях) в модели, а не поле возраста связан с этим подполь. Будет ли ManyToManyField работать для этого?

Основным требованием является то, что, когда пользователь выбирает подполе (скажем, детей) в браузере, отображаются все объекты с более высокими баллами.

Я очень новичок в Django, и любая помощь в этом будет замечательной. Благодарю.

ответ

0

Если я правильно понимаю ваш вопрос, вам нужно использовать поля ForeignKey.

class Deals(models.Model): 
    description = models.TextField() 
    price = models.DecimalField(max_digits=7, decimal_places=2) 
    #... 
    age = models.ForeignKey(Age) 

class Age(models.Model): 
    kid_score = models.IntegerField(max_length=2,default=0) 
    teenager_score = models.IntegerField(max_length=2,default=0) 
    #... 

Хорошо прочитайте docs on Models. Возможно, вам также полезно прочитать некоторые реляционные базы данных/базовый sql.

Когда вы приступите к редактированию своих объектов в администраторе django, вы, вероятно, захотите использовать класс InlineModelAdmin.

UPDATE

перечитывая свой вопрос, это звучит, как вы могли бы просто хотите, чтобы показать/скрыть эти дополнительные поля на основной модели сделки. Если это так, то вы хотите использовать поля в админе, с классом «свернуть». Вот пример в docs.

Если вы хотите, чтобы каждая запись Deal имела несколько связанных с ней kid_score, тогда вы хотите получить внешний ключ. Если у каждого Deal может быть только один kid_score, тогда вам нужно оставить поля kid_score (и другие) в основной модели (если это сбивает с толку, то определенно сделайте некоторое чтение в sql/реляционных базах данных).

+0

Спасибо Aidan, я действительно хочу иметь только один kid_score (и другие оценки) для каждого Сделки, но тогда я думал, что для этого 25 полей это сделает мою модель слишком сложной. В приведенном выше коде у меня есть только 4 поля, но у меня есть еще много (для разных полей). Я не уверен, почему сохранение всех этих 25 полей в моей модели было бы лучше, вместо того, чтобы иметь дополнительные ключи для возраста и т. Д. Кроме того, для меня лучше всего использовать «age = models.ForeignKey (Deals)» в классе моей возрастной модели. Большое спасибо за концепцию, хотя она была довольно гладкой, как только я ее получил. –

+0

Если это так, вам действительно нужно сохранить все на одной модели. Хотя вы можете создать поле OneToOne, я не думаю, что это правильное решение, учитывая, что все ваши объекты сделки будут иметь оценки. Вам просто нужно показать скрытые поля в вашем html. Это не так сложно сделать с ModelForms/Django Admin. –

+0

Да, я согласен, так как каждый объект сделки имеет только один kid_score и т. Д., Лучше разместить это поле в модели сделки. Однако, как я уже сказал, у меня много таких полей (6 по возрасту, 10 для отношений и т. Д.), Которые могут насчитывать более 30 таких полей. Не будет ли модель с 30-40 полями работать с запросом или другими сложными операциями? Есть ли лучший способ сделать это и сделать это быстрее? –

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