> 데이터 베이스 > MySQL 튜토리얼 > 외래 키가 있는 Django 모델이 다른 데이터베이스에 존재할 수 있나요?

외래 키가 있는 Django 모델이 다른 데이터베이스에 존재할 수 있나요?

Linda Hamilton
풀어 주다: 2024-10-29 12:22:29
원래의
851명이 탐색했습니다.

 Can Django Models with Foreign Keys Exist in Different Databases?

다른 데이터베이스의 외래 키와 함께 Django 모델 사용

Django에서는 다른 데이터베이스에 있는 모델을 생성할 수 있습니다. 그러나 이러한 모델 간의 외래 키 관계를 사용하는 데에는 제한이 있습니다.

다음 예를 고려하십시오.

<code class="python"># in 'urls' database
class LinkModel(models.Model):
    host_id = models.IntegerField()
    path = models.CharField(max_length=255)

# in default database
class NewsModel(models.Model):
    title = models.CharField(max_length=50)
    link = models.ForeignKey(LinkModel)</code>
로그인 후 복사

데이터베이스 라우터를 설정한 후 다음과 같은 경우 오류가 발생할 수 있습니다. 외래 키 할당:

<code class="python">newsItem.link = LinkModel.objects.using('urls').get(id=1)
# Cannot assign "LinkModel: /": instance is on database "default", value is on database "urls"</code>
로그인 후 복사

이는 Django가 데이터베이스 간 외래 키 관계를 지원하지 않기 때문입니다. 외래 키와 다대다 관계는 단일 데이터베이스 내부에 있어야 합니다.

버그 문제 해결

분할을 했는데도 이 오류가 발생하는 경우 모델이 올바르게 작동한다면 Django의 ForeignKey 클래스에 있는 버그 때문일 수 있습니다. 이 문제를 해결하려면 프로젝트에 패치를 적용할 수 있습니다.

In validate() method

# Old Code
assert target._database == self.opts.db

# New Code
assert target._database == self.opts.db or target._database is None
로그인 후 복사

솔루션

데이터베이스 간 제한을 피하려면 대안을 사용할 수 있습니다. 접근하다. 다음과 같이 외래 키 관계를 추상화하는 모델 생성을 고려해보세요.

<code class="python">class AbstractLinkModel(models.Model):
    host_id = models.IntegerField()
    path = models.CharField(max_length=255)

class LinkModel(AbstractLinkModel):
    class Meta:
        db_table = 'links'
        app_label = 'testapp'

class NewsModel(models.Model):
    title = models.CharField(max_length=50)
    link = models.ForeignKey(AbstractLinkModel)</code>
로그인 후 복사

추상 기본 모델을 사용하여 외래 키 관계를 정의하면 추상 모델의 여러 데이터베이스별 하위 클래스를 생성할 수 있습니다. 이를 통해 여러 데이터베이스에 데이터를 분할하면서 관계를 유지할 수 있습니다.

위 내용은 외래 키가 있는 Django 모델이 다른 데이터베이스에 존재할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿