У меня есть вопрос об этой ошибке и надеюсь, что кто-то столкнулся с ней, как и я. Я получаю эту ошибку на модели при попытке использовать поле 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.