Django管理模型关系

问题描述 投票:0回答:1

所以,我正在建立一个商店网站,我有2个应用程序,一个名为Store的应用程序,它有两个模型“Store”和“UnitStore”。第二个应用程序称为Product,而它有一个名为Store的单个模型。

在产品管理员中,我使用formfield_for_foreignkey方法显示StoreUnit和Store,如下所示:“Store_name | Unit_name”

所以,我的问题是,当我尝试创建产品时,它总是要求UnitStore的外键,但并非所有产品都来自UnitStore,某些产品只能在商店中找到,因此,我无法创建一个实例。

- Store > Models.py 

class Store(models.Model):

    store_name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.store_name 

class UnitStore(models.Model):

    store_unit_name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store = models.ForeignKey(
        Store,
        related_name='units',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        return self.store_unit_name 


Product > Models.py

class Product(models.Model):

    product= models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store_unit_name = models.ForeignKey(
        StoreUnit,
        related_name='units',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        return self.product

- Product > Admin.py

class CustomProduct(admin.ModelAdmin):
    model = Product
    list_display = ('product', 'created_at', 'aupdated_at',
                    'store_unit_name',)
    list_select_related = ('store_unit_name')
    fieldsets = (
        ("Prodcut's Name:", {
            'fields': ('product',)}),
        ('Store:', {
            'fields': ('store_unit_name',)}),  
    )

    def save_model(self, request, obj, form, change):
        obj.created_by = request.user
        super().save_model(request, obj, form, change)

我应该在Product模型中添加另一个外键,如下例所示。因此,我应该能够通过:product.store.store_name访问产品。

class Product(models.Model):

    product= models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store_unit_name = models.ForeignKey(
        StoreUnit,
        related_name='units',
        on_delete=models.CASCADE,
    )
  store= models.ForeignKey(
        Store,
        related_name='stores',
        on_delete=models.CASCADE,
    )
django django-admin django-orm django-admin-filters django-admin-tools
1个回答
0
投票

您需要具有捕获商店和单位商店的商店模型,并且其__str__方法应始终打印主商店名称和单位商店名称(如果适用):

class Store(models.Model):

    store_name = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    main_store = models.ForeignKey(
        'Store',
        null=True,
        related_name='units',
        on_delete=models.CASCADE,
    )

    def __str__(self):
        ret_value = self.main_store.store_name + " | " if self.main_store else ""
        return ret_value + self.store_name

一旦你拥有这样的模型,你就可以只有一个外键指向商店或单位商店。

class Product(models.Model):

    product = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    store= models.ForeignKey(
        Store,
        related_name='products',
        on_delete=models.CASCADE,
    )
© www.soinside.com 2019 - 2024. All rights reserved.