Python 管理中的Django反向外键
我有一个关于管理面板中外键的Django相关问题。我面临以下情况:Python 管理中的Django反向外键,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,我有一个关于管理面板中外键的Django相关问题。我面临以下情况: class Driver(models.Model): name = models.CharField(max_length=200) executable = models.CharField(max_length=200) class Device(models.Model): name = models.CharField(max_length=200) bound_driver = mo
class Driver(models.Model):
name = models.CharField(max_length=200)
executable = models.CharField(max_length=200)
class Device(models.Model):
name = models.CharField(max_length=200)
bound_driver = models.ForeignKey(Driver)
class DriverAssignment(models.Model):
device = models.ForeignKey(Device)
driver = models.ForeignKey(Driver)
每个设备都需要有一个绑定驱动程序(它使用的)。DriverAssignment应该是显示哪个设备可以使用哪个驱动程序的表。因此,一个设备可以有多种可能的驱动程序可以绑定。现在我想在我的管理面板上有一个下拉列表,显示特定设备的所有可能驱动程序,以选择“绑定驱动程序”
在Django我怎么做?对于一个有经验的Django人来说,这可能是件容易的事。我希望有人能给我一个提示,因为我是Django的新手。非常感谢 将您的模型结构更改为:
class Driver(models.Model):
name = models.CharField(max_length=200)
executable = models.CharField(max_length=200)
class Device(models.Model):
name = models.CharField(max_length=200)
bound_driver = models.ForeignKey(Driver, related_name="bound_to")
available_drivers = models.ManyToManyfield(Driver)
ManyToManyField将执行与DriverAssignment表相同的工作
您可以在可用驱动程序字段中添加可用驱动程序。
但是您也希望绑定的驱动程序是可用的驱动程序之一。您必须在表单中执行此验证。为此,你必须超越管理表格。参见链接
参考链接:
许多字段:
模型管理(超越管理功能):
如果您想了解更多信息,您必须花一些时间阅读和实施。:)
或
如果要使用相同的结构,则必须在ModelAdmin
中覆盖表单
,请参阅并提供自定义表单,如下所示:
class CustomForm(ModelForm)
bound_driver = forms.ModelChoiceField(queryset = <your custom queryset that returns only available drivers>, ...)
class Meta:
model = Device
class自定义表单(ModelForm)
绑定驱动程序=forms.modelcooicefield(queryset=,…)
类元:
型号=设备
有一个反向内联线的代码段。如果您仍然需要,可以尝试以下方法: 我在django 1.5和1.6中的OneToOneField中使用了它。不幸的是,我没有为ForeignKeyField测试它,但是之前的一个用户声称它也适用于ForeignKeyField 其中包含对代码段的最佳描述。Person类是DriverAssignment类,设备对应于下例中的Address类:
Example:
from django.db import models
class Address(models.Model):
street = models.CharField(max_length = 255)
zipcode = models.CharField(max_length = 10)
city = models.CharField(max_length = 255)
class Person(models.Model):
name = models.CharField(max_length = 255)
business_addr = models.ForeignKey(Address,
related_name = 'business_addr')
home_addr = models.OneToOneField(Address, related_name = 'home_addr')
other_addr = models.OneToOneField(Address, related_name = 'other_addr')
You use reverseadmin in the following way:
from django.contrib import admin
from django.db import models
from models import Person
from reverseadmin import ReverseModelAdmin
class AddressForm(models.Form):
pass
class PersonAdmin(ReverseModelAdmin):
inline_type = 'tabular'
inline_reverse = ('business_addr', ('home_addr', AddressForm), ('other_addr' (
'form': OtherForm
'exclude': ()
)))
admin.site.register(Person, PersonAdmin)
inline_type can be either "tabular" or "stacked" for tabular and
stacked inlines respectively.
对于Django>1.8
使用(适用于2.2的文档)如下所述:
models.py
管理员
我想曼尼托曼尼菲尔德就是你想要的答案。如果我错了,请纠正我。我认为这只会去掉DriverAssignment模型(因为它将自动创建一个联接表),但是我如何在管理页面上显示它呢?如何让用户选择与设备存在多对多关系的驱动程序?非常感谢您的回答!在管理面板中有一个下拉列表,这样用户就可以只选择一个有效的“boud_驱动程序”,这不是更好吗?这样,我就不需要表单验证,而且它对用户更加友好。是的,您可以这样做,但为了实现这一点,您也必须覆盖管理员使用的模型表单,以提供自定义查询集。看:做得很好,第一次尝试就成功了,这正是我想要的
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
author = models.ForeignKey(Author, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
from django.contrib import admin
class BookInline(admin.TabularInline):
model = Book
class AuthorAdmin(admin.ModelAdmin):
inlines = [
BookInline,
]