Как добавить данные в отношения с несколькими внешними ключами в Django? - PullRequest
0 голосов
/ 11 сентября 2011

Как добавить данные в отношения с несколькими внешними ключами в Django?

Я создаю симуляцию, написанную на python, и хотел бы использовать форму django для хранения (промежуточного и конечного) результатов в базе данных. Поэтому меня не интересуют URL-адреса и представления.

Проблема, с которой я сталкиваюсь, - это создание объекта с несколькими ForeinKeys. Этот объект должен представлять отношения между агентом и временным шагом.

Вот код:

Я использую следующие модели

from django.db import models
import random
from django.contrib.admin.util import related_name

# Create your models here.
class Agent(models.Model):

    agent = int
    def __init__(self, agent, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.agent = agent

    def __str__(self):
        return str(self.agent)

class Step(models.Model):

    step = int

    def __init__(self, step, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.step = step

    def __str__(self):
        return str(self.step)


class StepAgentData(models.Model):

    def __init__(self, step, agent, *args, **kwargs):
        models.Model.__init__(self, *args, **kwargs)
        self.step = step  #This does not work
        self.agent = agent

    step = models.ForeignKey(Step, related_name='time_step')
    agent = models.ForeignKey(Agent, related_name='associated_agent')
    data = float    

    def __unicode__(self):
        return str("Step %s \t Agent %s ", (self.step,self.agent))

Запуск следующего скрипта

from DBStructureTest.App.models import Step, Agent, StepAgentData

if __name__ == '__main__':
    s = Step(1)
    s.save()
    a = Agent(2)
    a.save()
    sad = StepAgentData(s,a)
    sad.save()

    print "finished"   

приводит к следующему сообщению об ошибке при выполнении self.step = step в конструкторе StepAgentData (см. Комментарий в коде модели StepAgentData)

>  File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py",
> line 367, in __set__
>     val = getattr(value, self.field.rel.get_related_field().attname)  
> File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py",
> line 773, in get_related_field
>     data = self.to._meta.get_field_by_name(self.field_name)   File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py",
> line 307, in get_field_by_name
>     cache = self.init_name_map()   File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py",
> line 337, in init_name_map
>     for f, model in self.get_all_related_m2m_objects_with_model():  
> File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py",
> line 414, in get_all_related_m2m_objects_with_model
>     cache = self._fill_related_many_to_many_cache()   File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/options.py",
> line 428, in _fill_related_many_to_many_cache
>     for klass in get_models():   File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py",
> line 167, in get_models
>     self._populate()   File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py",
> line 61, in _populate
>     self.load_app(app_name, True)   File
> "/usr/local/lib/python2.7/dist-packages/django/db/models/loading.py",
> line 76, in load_app
>     app_module = import_module(app_name)   File
> "/usr/local/lib/python2.7/dist-packages/django/utils/importlib.py",
> line 35, in import_module
>     __import__(name) ImportError: No module named App

Структура папок следующая:

|-DBStructureTest
    |-App
        |-__init__.py       
        |-Main.py
        |-models.py
        |-test.py
        |-views.py
    |-__init__.py
    |-manage.py
    |-settings.py
    |-urls.py

Что я делаю не так? Помощь очень ценится.

EDIT: В каталоге / App я получаю следующее после «импорта моделей» `

импорт моделей Traceback (последний вызов был последним): Файл "", строка 1, в Файл "models.py", строка 1, в из django.db импортировать модели Файл "/usr/local/lib/python2.7/dist-packages/django/db/init.py", строка 14, в если нет настроек. БАЗЫ: Файл "/usr/local/lib/python2.7/dist-packages/django/utils/functional.py", строка 276, в getattr self._setup () Файл "/usr/local/lib/python2.7/dist-packages/django/conf/init.py", строка 40, в _setup повысить ImportError («Невозможно импортировать настройки, поскольку переменная среды% s не определена.»% ENVIRONMENT_VARIABLE) ImportError: Невозможно импортировать настройки, поскольку переменная окружения DJANGO_SETTINGS_MODULE не определена. «

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

это две разные проблемы.исходный потому, что кажется, что вы запускаете свой скрипт из каталога DBStructureTest, поэтому он пытается найти в нем подкаталог DBStructureTest.второй не требует пояснений, вам нужно установить env var или запустить "manage.py shell"

Кстати, я не вижу полей базы данных в ваших моделях.Содержат ли соответствующие таблицы SQL что-нибудь?

0 голосов
/ 11 сентября 2011

Во-первых, вы можете использовать отношения ManyToMany для класса StepAgent-Class.Вы также можете иметь дополнительные поля для отношений «многие ко многим» , и это будет более подходящим дизайном.

Для вашей ошибки вам нужно export DJANGO_SETTINGS_MODULE=settings, однако модуль настройки можно получить изтекущий PYTHONPATH, иначе django не знает, где найти и как настроить ваши параметры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...