2015-02-25 3 views
1

В моих моделях я использую опцию choices в некоторых моих полях. Но я использую одни и те же варианты в нескольких приложениях в своем проекте Django.Поделиться вариантами в приложениях Django

Где я могу разместить свой выбор и как загрузить эти варианты во всех моих приложениях?

ответ

0

эта проблема имеет несколько решений:

  1. положил свой выбор на файл настроек и получить эти значения в приложениях.
  2. набор CONSTANT в приложении или определить модели и доступ выбор по onwer имя
  3. установить параметры элементов один-ко-многим, и затем вы можете получить доступ к выбору по модели

    ...

также вы можете смешивать эти способы :)

2

Обычно у нас есть довольно много конкретных проектов для каждого проекта, а также для того, чтобы попытаться сохранить зависимости достаточно чистыми мы, как правило, еще два приложения:

  • «ядро», в котором мы навели разделяемые другими приложениями (любое приложение может зависеть от «ядра», «ядро» не зависит от любого приложения),

  • и «главное», в котором связывают вещи («главное» может зависеть от любого приложения, ни одно приложение не может зависеть от «основного»).

В вашем случае эти общие варианты будут принадлежать core.models.

1

Мне нравится помещать все константы в файл constants.py внутри каждого приложения. Когда мы хотим, чтобы между приложениями были какие-то глобальные варианты, мы помещаем их в «основное» приложение (как описано в описании @bruno desthuilliers) и импортируем их при необходимости.

Пример:

constants.py

# -*- coding: utf-8 -*- 

STATE_1 = 0 
STATE_2 = 1 
STATE_3 = 2 

STATE_CHOICES = (
    (STATE_1, 'STATE 1'), 
    (STATE_2, 'STATE 2'), 
    (STATE_3, 'STATE 3') 
) 

any_app/models.py

from django.db import models 
from other.app.models import User 
from core.constants import SOME_OTHER_CHOICES 
from core.constants import STATE_1_REAL 
from .constants import STATE_CHOICES 
from .constants import STATE_1 



class ModelX(models.Model): 
    user = models.ForeignKey(User) 
    state = models.IntegerField(verbose_name=u'state', 
           choices=STATE_CHOICES, 
           default=STATE_1) 
    core_state = models.IntegerField(verbose_name=u'real state', 
            choices=SOME_OTHER_CHOICES, 
            default=STATE_1_REAL) 

    class Meta: 
     ordering = ('-state',) 
Смежные вопросы