在 Django 模型中存储对象列表

szu*_*ins 7 python django

在 Django 中有没有办法在另一个对象中存储和管理多个对象(在 Django admin 中)?

例如,我有两个模型:Items 和 RMA。RMA 内部可能有多个项目。每个 Item 都是独一无二的,因为它是一个库存部件,所以我不能只用 foreignKey 多次引用同一个项目(尽管我可能误解了它的使用/实现)。

所以现在,我有一个 Item 模型:

class Item(models.Model):
    serial_number = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    part_number = models.CharField(max_length=200)
    location = models.CharField(max_length=200)
    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

和 RMA 模型:

class RMA(models.Model):
    number = models.AutoField(primary_key=True)
    items = ?????
Run Code Online (Sandbox Code Playgroud)

最终,我希望能够在必要时继续使用 Django 管理功能从 RMA 添加/删除项目,因此我一直避免序列化列表然后反序列化显示。任何帮助将非常感激。

Seb*_*zny 7

您正在建模多对多关系。

这将使用外键对 RMA进行建模:

class Item(models.Model):
    serial_number = models.CharField(max_length=200)
    name = models.CharField(max_length=200)
    part_number = models.CharField(max_length=200)
    location = models.CharField(max_length=200)
    rma = models.ForeignKey(RMA)
    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

要使其在RMA您的管理员中可以访问,您需要 djangos InlineAdmin功能。

您可以在django 教程第 2 部分中找到示例。


小智 5

您正在有效地描述多对一关系,为此,您必须将外键引用添加到Item模型中,而不是模型中RMA

您还可以添加 arelated_name来为RMA模型提供一个可以调用的属性。

例如:

class Item(models.Model):
    rma = models.ForeignKey(RMA,related_name="items")
    serial_number = models.CharField(max_length=200)
    # etc...
Run Code Online (Sandbox Code Playgroud)

要管理这些的创建,您需要一个InlineModelAdmin 表单,因此您的admin.py文件将需要如下所示:

from django.contrib import admin

class ItemInline(admin.TabularInline):
    model = Item

class RMAAdmin(admin.ModelAdmin):
    inlines = [
        ItemInline,
    ]
Run Code Online (Sandbox Code Playgroud)