2015-11-04 20 views
5

Bu yüzden, başka bir tabloya yabancı anahtar içeren tek bir tablo oluşturmayı ve anahtarın hangi tabloya ait olması gerektiğini başka bir alan "türü" kullanarak oluşturmayı düşündüğüm bir sorum var. .Django, birçok tablo için bir yabancı anahtar modelini kullanıyor

class Status(Models.model): 
    request = models.ForeignKey("Request1", "Request2", "Request3") 
    request_type = models.IntegerField() 
    ...Some status related data 

class Request1(Models.model): 
    ...Some data 

class Request2(Models.model): 
    ...Some other data 

Class Request3(Models.model): 
    ...different data 

Sorum şu ki, böyle bir yabancı anahtar tanımlamak mümkün mü? benim aklıma başka bir çözüm bu

class Status(Models.model): 
    request1 = models.ForeignKey("Request1") 
    request2 = models.ForeignKey("Request2") 
    request3 = models.ForeignKey("Request3") 
    ...Some status related data 

class Request1(Models.model): 
    ...Some data 

class Request2(Models.model): 
    ...Some other data 

Class Request3(Models.model): 
    ...different data 

gibi Modelimin tanımlamak oldu Ama bunu yaparsam bu şekilde sadece 1 yabancı anahtar verileri olmasına izin ve diğer söylüyor django üzerinden bir kısıtlamayı tanımlamak mümkündür iki null olmalı? veya db tarafında bu kısıtlamayı kesin olarak ayarlamak zorunda mıyım (postgres kullanıyorum) dbgo'yu db oluşturduğunda bunu yapmasını söylemek istiyorum ki her zaman birini hatırlamak zorunda değilim db'yi yeniden oluşturur.

Herhangi bir girdi veya öneri çok takdir edilecektir. Bu fikirlerin hiçbiriyle evli değilim, bu yüzden aynı etkiyi elde etmenin başka bir akıllı yolu varsa, bunu duymaya devam ediyorum. Zaman ayırdığın için teşekkürler.

Düzenleme: Sen Django contentypes çerçevesini kullanmalısınız django 1.7.10

+0

sadece istiyorsunuz İhtiyaçlarınız için https://docs.djangoproject.com/en/1.8/ref/contrib/contenttypes/#generic-relations şöyle bir şey olabilir:

burada genel bir ilişki için bir örnek var Üçüncüsü FK olmak mı? –

+0

Maalesef, her durum yalnızca bir isteğe bağlantı vermelidir. – mingle

cevap

12

kullanıyorum.

from django.db import models 
from django.contrib.contenttypes.fields import GenericForeignKey 
from django.contrib.contenttypes.models import ContentType 

class Status(models.Model): 
    request_type = models.ForeignKey(ContentType) 
    request_id = models.PositiveIntegerField() 
    request = GenericForeignKey('request_type', 'request_id') 

Sonra aşağıdaki gibi bir şey yapabilirsiniz:

status1 = Status(request=Request1("foo")) 
status1.save() 
status2 = Status(request=Request2("bar")) 
status2.save() 

status1.request // <Request1 "foo"> 
status1.request // <Request2 "bar"> 
+0

Vay, tam olarak aradığım şey gibi görünüyor. Teşekkür ederim – mingle

+0

Haha, evet. İyi sezgi ;-) – Sebastian

+0

İyi biri, bir sorum var: foo veya nesneden durum nesnesine nasıl erişilir? –

İlgili konular