Python 管理中的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

我有一个关于管理面板中外键的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)

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,
    ]