2016-07-19 17 views
1

Ich habe 2 Modelle: Stadt und Service. Jeder Stadteintrag kann viele Dienste enthalten und jeder Dienst kann mit jeder Stadt verknüpft werden.Django - ManyToMany Beziehung ohne den Kreuztisch

class City(models.Model): 
    name = models.CharField(max_length=255, unique=True) 

class Service(models.Model): 
    name = models.CharField(max_length=255, unique=True) 

class CityService(models.Model): 
    city = models.ForeignKey(City) 
    service = models.ManyToManyField(Service) 

Ich benutze ManyToManyField die Mehrfachauswahl in Django Admin zu aktivieren. m2m Beziehungen Aber Django schafft eine weitere Tabelle zu speichern ..

Ist es möglich, Django Modelle so zu konfigurieren, dass die folgende Tabellenstruktur zu erreichen:

+----+---------------+------------+ 
| id | city_id  | service_id | 
+----+---------------+------------+ 
| 1 |    1 |   1 | 
| 2 |    1 |   2 | 
| 3 |    2 |   3 | 
+----+---------------+------------+ 
+2

Wenn Sie möchten, dass das Modell so ist, wie Sie es beschrieben haben, dann ist natürlich kein ManyToManyField erforderlich. Das Speichern von Daten auf diese Weise ist jedoch so, als würden Sie redundante Daten zu Ihrer Datenbank hinzufügen, da Sie jedes Mal ein neues Objekt erstellen, um eine Stadt und ein Service-Mapping zu erstellen. Stattdessen können Sie einfach eine Liste von Services für eine bestimmte Stadt speichern es zu tun. –

Antwort

0

Warum eine Struktur wie nicht nur verwenden:

class Service(models.Model): 
    name = models.CharField(max_length=255, unique=True) 

class City(models.Model): 
    name = models.CharField(max_length=255, unique=True) 
    service = models.ManyToManyField(Service) 
0

Es besteht keine Notwendigkeit für die CityService Tabelle überhaupt . Ein ManyToManyField bereits impliziert eine Join-Tabelle; Sie erstellen eine Sekunde eine, zu keinem Zweck überhaupt. Habe die M2M direkt zwischen City und Service.

1

Sie die ManyToManyField Nutzung mißverstanden. Sie müssen kein separates Modell erstellen, um diese Beziehung zu verwenden. Um ein separates Modell zu erstellen, das als ManyToManyField funktioniert, wird die Beziehung unten erwähnt. Aber so können Sie nicht die Funktion nutzen, die Django für diese manytomany Beziehung bietet.

class CityService(models.Model): 
    # Also you can add additional fields 
    city = models.ForeignKey(City) 
    service = models.ForeignKey(Service) 

    class Meta: 
    unique_together = ('city', 'service') # Make sure you dont have duplicate record in the table if so then remove this relation. 

Aber wenn du mit dem Django gehen gerne zur Verfügung gestellt ManyToManyField Beziehung und lassen sie eine eigene Tabelle erstellen. benutze einfach den untenstehenden Code .. das wird schon von @Jedi vorgeschlagen.

class City(models.Model): 
    name = models.CharField(max_length=255, unique=True) 

class Service(models.Model): 
    name = models.CharField(max_length=255, unique=True) 
    city = models.ManyToManyField(City) 
Verwandte Themen