Django 1.3 Соответствующего запроса не существует - PullRequest
1 голос
/ 13 декабря 2011

У меня есть вопрос об этой ошибке и надеюсь, что кто-то столкнулся с ней, как и я. Я получаю эту ошибку на модели при попытке использовать поле Models.ForeignKey. Я могу проверить, существует ли таблица, в которой используется внешний ключ, а также таблица, на которую ссылается fk. Я могу заставить модель работать, если я использую CharField, но это не весело.

Вот таблицы (с использованием Postgresql 9.0), которые я не проектировал, поэтому, пожалуйста, не тратьте на меня слишком много, если вам это не нравится, хотя я не могу гарантировать, что разработал бы его лучше:

Claim_status

     Column      |            Type             |                               Modifiers                                
-----------------+-----------------------------+------------------------------------------------------------------------
 claim_no        | character varying(30)       | not null
 claim_status    | character varying(15)       | 
 userid          | character varying(40)       | not null
 note            | character varying(255)      | 
 time            | timestamp without time zone | default now()
 claim_status_id | integer                     | not null default nextval('claim_status_claim_status_id_seq'::regclass)
Indexes:
    "claim_status_pkey" PRIMARY KEY, btree (claim_status_id)
    "ndx_claim_status_claim_no" btree (claim_no) CLUSTER
    "ndx_claim_status_claim_status" btree (claim_status)
    "ndx_claim_status_date_time" btree (date("time"))
    "ndx_claim_status_time" btree ("time")
    "ndx_claim_status_upper_userid" btree (upper(userid::text))
    "ndx_claim_status_userid" btree (userid)
Foreign-key constraints:
    "$1" FOREIGN KEY (claim_status) REFERENCES lk_claim_status(claim_status)
    "claim_status_claim_no_fkey" FOREIGN KEY (claim_no) REFERENCES claim(claim_no) ON UPDATE CASCADE

lk_claim_status

        Column        |         Type          |   Modifiers   
----------------------+-----------------------+---------------
 claim_status         | character varying(15) | not null
 description_internal | character varying(35) | not null
 description_web      | character varying(35) | not null
 display_insured_web  | boolean               | default false
 display_rep_web      | boolean               | default false
Indexes:
    "lk_claim_status_pkey" PRIMARY KEY, btree (claim_status)
Referenced by:
    TABLE "claim_status" CONSTRAINT "$1" FOREIGN KEY (claim_status) REFERENCES lk_claim_status(claim_status)

Мои модели:

from django.db import models
from test.django.common.models.claim.lk_claim_status import LkClaimStatus

class ClaimStatus(models.Model):
    claim_no = models.CharField(max_length=40)
    # the foreign key does not work here, you get matching query error for some reason.
    claim_status = models.ForeignKey(LkClaimStatus, db_column='claim_status')
    #claim_status = models.CharField(max_length=15)
    userid = models.CharField(max_length=40)
    note = models.CharField(max_length=255)
    time = models.DateTimeField(auto_now=True)
    claim_status_id = models.AutoField(primary_key=True)
    class Meta:
        db_table = u'claim_status'

- конец претензии_status.py - начало lk_claim_status.py

from django.db import models

class LkClaimStatus(models.Model):
    claim_status = models.CharField(max_length=15, primary_key=True)
    description_internal = models.CharField(max_length=35)
    description_web = models.CharField(max_length=35)
    display_insured_web = models.BooleanField()
    display_rep_web = models.BooleanField()
    class Meta:
        db_table = u'lk_claim_status'

Я еще не использовал ни на одной странице, но только что протестировал их с помощью оболочки manage.py

Здесь были мои тесты

from test.django.common.models.claim.claim_status import ClaimStatus
from test.django.common.models.claim.lk_claim_status import LkClaimStatus
status_list = ClaimStatus.objects.filter(claim_no='TEST')
for status in status_list:
  try:
    print status.claim_status.claim_status
  except LkClaimStatus.DoesNotExist:
    print "Got a blank one"

Этот последний тест выводит только выражение «кроме». Если я использую опцию CharField из модели ClaimStatus, я могу напечатать status.claim_status и получить значение из таблицы БД.

from test.django.common.models.claim.claim_status import ClaimStatus
from test.django.common.models.claim.lk_claim_status import LkClaimStatus
status_list = ClaimStatus.objects.filter(claim_no='TEST')
for status in status_list:
    print status.claim_status.claim_status

С вышеупомянутым тестом я получаю это:

>>> for status in status_list:
...     print status.claim_status.claim_status
... 
Traceback (most recent call last):
  File "<console>", line 2, in <module>
  File "/usr/lib/python2.5/site-packages/django/db/models/fields/related.py", line 315, in __get__
    rel_obj = QuerySet(self.field.rel.to).using(db).get(**params)
  File "/usr/lib/python2.5/site-packages/django/db/models/query.py", line 349, in get
    % self.model._meta.object_name)
DoesNotExist: LkClaimStatus matching query does not exist.

Я бы понял это, если бы таблицы не существовало или поля не существовали, но они есть? Я также могу убедиться, что с помощью теста в этой таблице нет значений NULL для этого поля Applic_status.

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Я определенно вижу одну проблему с вашими моделями здесь. Когда вы определяете поле ForegnKey с именем «demand_status», Django автоматически создает в экземплярах вашей модели атрибут с именем «Applic_status_id», который будет использоваться для хранения необработанного значения столбца базы данных «Applic_status». Однако у вас уже есть поле первичного ключа с тем же именем, что, вероятно, приводит к конфликту.

Я не уверен, каков официальный способ решения этой проблемы, но вы можете попытаться создать подкласс ForeignKey и переопределить его метод get_attname (), чтобы вернуть что-то еще.

0 голосов
/ 13 декабря 2011

Вам необходимо выполнить самоанализ базы данных (также называемый рефлексией), который создаст для вас подходящие классы django.В терминологии django это называется инспекция

Как только вы получите settings.py с соответствующими настройками БД, выполните эту команду:

python manage.py inspectdb > models.py

Это должно дать вам лучшее отображение django вашей базы данных и позволит вам выполнять ваши запросы.

...