2014-02-25 54 views
0

我有這樣的代碼:Python/Django - 間接雙向m2m關係?

class Reference(models.Model): 
    title = models.CharField(max_length=200, verbose_name = _('title')) 

    def __unicode__(self): 
     return u"%s" % (self.title) 

    class Meta: 
     verbose_name = _('bibliographic reference') 
     verbose_name_plural = _('bibliographic references') 


class Relation(models.Model): 
    reference = models.ForeignKey(Reference) 
    circuit = models.ManyToManyField('Circuit', related_name = 'relation_circuit', verbose_name = _('Circuits')) 

    def __unicode__(self): 
     return u"%s " %(self.reference) 

    class Meta: 
     verbose_name = _('relation') 
     verbose_name_plural = _('relations') 


class Circuit(models.Model): 
    name = models.CharField(max_length=200, verbose_name = _('name')) 
    reference = models.ManyToManyField(Relation, through=Relation.circuit.through, related_name='relation_circuit', verbose_name = _('Bibliographic References')) 

    def __unicode__(self): 
     return u"%s" % (self.name) 

    class Meta: 
     verbose_name = _('circuit') 
     verbose_name_plural = _('circuits') 

關係被示出爲與參考內嵌。 我需要在我的Circuits和References之間創建一個雙向關係,但是我不知道如何顯示我的所有引用,而不是隻顯示那些有關係的人,因爲他們之間有Relation。

有人可以幫助我嗎?

非常感謝。

+0

你有什麼理由不能使用直通表嗎?如在https://docs.djangoproject.com/en/dev/topics/db/models/中一樣? –

+0

這段代碼很奇怪,至少可以說。你能用自己的話來描述你實際上想要達到的目標嗎?如果你想繪製更有用的ERD。 – vartec

+0

我認爲不是。我發佈的解決方案使用了直通表,但是當我在Circuits中時,我只能看到那些有關係的引用,而不是我參考模型中的所有引用。也許我可以用其他方式定義直通表,但我不知道如何。任何想法? :) – user3350963

回答

0

這將是我的出發點。

class Reference(models.Model): 
    title = models.CharField(max_length=200) 
    relations = models.ManyToManyField('Relation', related_name="reference_relations", null=True, blank=True) 

    def __unicode__(self): 
     return u"%s" % (self.title,) 


class Relation(models.Model): 
    reference = models.ForeignKey(Reference) 
    circuit = models.ForeignKey('Circuit') 

    def __unicode__(self): 
     return u"%s <-> %s " %(self.reference, self.circuit) 



class Circuit(models.Model): 
    name = models.CharField(max_length=200) 
    relations = models.ManyToManyField(Relation, related_name="circuit_relations", null=True, blank=True) 

    def __unicode__(self): 
     return u"%s" % (self.name) 

admin.py

from django.contrib import admin 
from web.models import * 


class RelationInline(admin.TabularInline): 
    model = Relation 

class CircuitAdmin(admin.ModelAdmin): 
    inlines = [ 
     RelationInline, 
    ] 

class ReferenceAdmin(admin.ModelAdmin): 
    inlines = [ 
     RelationInline, 
    ] 

admin.site.register(Reference,ReferenceAdmin) 
admin.site.register(Relation) 
admin.site.register(Circuit, CircuitAdmin) 

當然,你可以做到這一點,而不通過表,但我的偏好是保持關係簡單。

0

我不知道我是否完全理解你需要什麼,但不會有一個外鍵的表都足夠了?

喜歡的東西

class Reference(models.Model): 
    title = models.CharField(max_length=200, verbose_name = _('title')) 


class Circuit(models.Model): 
    name = models.CharField(max_length=200, verbose_name = _('name')) 


class Relation(models.Model): 
    reference = models.ForeignKey(Reference) 
    circuit = models.ForeignKey(Circuit) 

然後你就可以像這樣建立關係的一個實例,將它們鏈接:

circuit = Circuit(name="cool_circuit") 
reference = Reference(title="cool_reference") 

relation = Relation(reference=reference, circuit=circuit) 

它也很容易得到的所有引用鏈接到一些電路

circuit = Circuit.objects.get(id=1) 

references_linked_to_circuit_1 = Reference.objects.filter(relation__circuit=circuit) 

並且同樣對於鏈接到參考的所有電路

reference = Circuit.objects.get(id=1) 

circuits_linked_to_reference_1 = Reference.objects.filter(relation__reference=reference)