Domanda

I am new to Django and databases and after reading the Django documentation on models I have the following question: Let's say I have 3 models: VehicleName, CarManufacturer and TruckManufacturer. I am trying to create a database relationship where CarMaunfacturer has many VehicleNames and also TruckManufacturer has many VehicleNames. What is the relationship here and how to define it in Django? Is it as simple as define a models.ForeignKey(VehicleName) in both CarManufacturer and TruckManufacturer? Thanks.

from django.db import models

class CarManufacturer(models.Model):
    vehicle_name = models.ForeignKey(VehicleName)  # IS THIS CORRECT???
    # ...
    pass

class TruckManufacturer(models.Model):
    vehicle_name = models.ForeignKey(VehicleName)  # IS THIS CORRECT???
    # ...
    pass

class VehicleName(models.Model):
    # ...
È stato utile?

Soluzione

To do exactly what you're describing:

I am trying to create a database relationship where CarMaunfacturer has many VehicleNames and also TruckManufacturer has many VehicleNames

You'd create a nullable foreign key on VehicleName to both of your Manufacturer models:

class CarManufacturer(models.Model):
    # field definitions here

class TruckManufacturer(models.Model):
    # field definitions here

class VehicleName(models.Model):
    car_manufacturer = models.ForeignKey(CarManufacturer, blank=True, null=True)
    truck_manufacturer = models.ForeignKey(TruckManufacturer, blank=True, null=True)

Then, instances of CarManufacturer or TruckManufacturer can get the names via the vehiclename_set attribute.

For a more advanced design, I would probably try to abstract the shared manufacturer behavior into a single model, then use multi-table inheritance:

class Manufacturer(models.Model):
    # shared car and truck manufacturer fields go here

class CarManufacturer(Manufacturer):
    # car manufacturer specific fields go here

class TruckManufacturer(Manufacturer):
    # truck manufacturer specific fields go here

class VehicleName(models.Model):
    manufacturer = models.ForeignKey(Manufacturer)

See the multi-table inheritance docs for full details.

Altri suggerimenti

I do not think you are understanding the manufacturer to vehicle relationship property. What I think you are trying to show is that a certain Vehicle belongs to a certain manufacturer.

This type of relationship would actually be defined in the Vehicle class, as a foreign key, called manufacturer, in the Vehicle class.

In the case you are defining many vehicles under a manufacturer, you just need to rename the property to car_model or something of the like and you should be fine.

I think you have the understanding mapped out well enough. Just remember that foreign keys are only a property of one table, and say nothing about the other table itself until the relationship is established there also.

If you're working with a larger relationship, with multiple objects, you should look into using the Many-to-many field described in the django documentation.

They have an example that shows how an Articles have many Publications:

class Publication(models.Model):
    title = models.CharField(max_length=30)

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ('title',)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)

    # On Python 3: def __str__(self):
    def __unicode__(self):
        return self.headline

    class Meta:
        ordering = ('headline',)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top