首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理中的Django反向外键

管理中的Django反向外键
EN

Stack Overflow用户
提问于 2014-05-02 12:55:06
回答 3查看 9.3K关注 0票数 4

我在管理面板中有一个关于外键的Django相关问题。我面临以下情况:

代码语言:javascript
复制
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有点陌生。非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-02 13:15:12

模型结构更改为:

代码语言:javascript
复制
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表相同的工作。

您可以在“可用驱动程序”字段中添加可用驱动程序。

,但是您也希望bound_driver是可用的驱动程序之一,。您必须在表单中进行此验证。为此,你必须通过行政管理表格。见链接

参考链接:

ManytoMany字段https://docs.djangoproject.com/en/1.6/ref/models/fields/#django.db.models.ManyToManyField

模型管理(到过载管理功能)https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#modeladmin-objects

如果你想学到更多的东西,你将不得不花一些时间阅读和实现。:)

如果您想使用相同的结构,则必须在form in ModelAdmin中使用这里并提供自定义表单,如下所示:

代码语言:javascript
复制
class CustomForm(ModelForm)
  bound_driver = forms.ModelChoiceField(queryset = <your custom queryset that returns only available drivers>, ...)
  class Meta:
    model = Device

https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

票数 2
EN

Stack Overflow用户

发布于 2016-07-05 12:53:54

代表Django >1.8

使用InlineModelAdmin (文档为2.2),在这里解释如下:

models.py

代码语言:javascript
复制
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)

admin.py

代码语言:javascript
复制
from django.contrib import admin

class BookInline(admin.TabularInline):
    model = Book

class AuthorAdmin(admin.ModelAdmin):
    inlines = [
        BookInline,
    ]
票数 7
EN

Stack Overflow用户

发布于 2014-07-14 09:45:25

反行内嵌有一个片段。如果您仍然需要它,您可以尝试如下:https://gist.github.com/mzbyszewska/8b6afc312b024832aa85

它被我用在django 1.5和1.6中的OneToOneField中。不幸的是,我没有对ForeignKeyField进行测试,但是前面的一个用户声称它也适用于ForeignKeyField。

代码片段的最佳描述包含在其中。Person类是您的DriverAssignment类,设备对应于下面示例中的Address类:

代码语言:javascript
复制
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.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23428717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档