1

嗨#1人,Django的:最佳实践与Foreignkeys和多种型号

什么是从一个模式是指ForeignKeys的选择的最佳方式?

我正在致力于租赁应用程序,其中包括GenericVehicle,自行车和汽车的模型。

class GenericVehicle(models.Model): 
    licence = models.CharField(max_length=128) 
    ... 
    class Meta: 
     abstract = True 

class Bike(GenericVehicle): 
    engine_type = models.CharField(max_length=128) 
    ... 

class Car(GenericVehicle): 
    number_of_doors = models.SmallIntegerField() 
    ... 

现在我有一个租赁登记的模型,在那里我想注册租用的车辆。我不确定这里的最佳做法。到目前为止,我有两个外键,并确保至少有一个填充。但是这种解决方案似乎效率很低,并且不适合多种车型。

改进类结构/定义的最佳方法是什么?

class Rental(models.Model): 
    rental_bike = models.ForeignKey(Bike) 
    rental_car = models.ForeignKey(Car) 
    rental_date = ... 

谢谢您的建议。我正在努力寻找一段有效的解决方案。

回答

3

Django为您提供GenericForeignKey。一个GenericForeignKey将需要在你的模型,一个字段保存参考模型的ContentType,第二个保存对象的ID:

from django.db import models 
from django.contrib.contenttypes.models import ContentType 
from django.contrib.contenttypes import generic 

class Rental(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 

    rental_vehicle = generic.GenericForeignKey('content_type', 'object_id') 

但请记住,这不是在数据库级别的外键,只是Django的类似于模仿外键的一些典型行为。