как связать поле? - PullRequest
       23

как связать поле?

0 голосов
/ 10 августа 2011

Это мои модели двигателей

from django.db import models

class Colors(models.Model):
   color_name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.color_name

Это мои автомобили моделей

from django.db import models

class Cars(models.Model):
    car_model = models.CharField(max_length=50)
    car_colors = models.ManytoManyField(Colors, related_name='Car Colors')

    def __unicode__(self):
        return self.car_model

O.K. Давайте посмотрим мою модель CarsData.

Это мои модели CarsData

from django.db import models

class CarsData(models.Model):
    car_barcode= models.CharField(max_length=50)
    available_color = ChainedForeignKey(
                   Cars,
                   chained_field="car_model",
                   chained_model_field="car_colors",
                   show_all=False,
                   auto_choose=True
                 )

    def __unicode__(self):
        return self.car_barcode

Мой admin.py выглядит так:

from django.contrib import admin
from django import forms
from myapp.models import *

class CarsDataAdminForm(forms.ModelForm):
    class Meta:
        model = CarsData

    def __init__(self, *arg, **kwargs):
        super(CarsDataAdminForm, self).__init__(*arg, **kwargs)
        self.fields['available_color'].choices = [(csc.id,csc.car_colors) for csc in Cars.objects.all()


class CarsDataAdmin(admin.ModelAdmin):
    form = CarsDataAdminForm

admin.site.register(CarsData,CarsDataAdmin)

Есть ли какой-либо способ показать в данных поля ChoiceField 'just' color_name? Я вижу только car_model, потому что я должен установить его:

def __unicode__(self):
    return self.car_model

Как связать поле available_colors с полем color_name? Я хочу показать в списке доступных_цветов только названия цветов, такие как красный, синий, черный, белый ...

Не могли бы вы дать мне пример?

1 Ответ

1 голос
/ 10 августа 2011

Мне кажется, я не понимаю ваш код:

class CarsData(models.Model):

    car_barcode = models.CharField(max_length=50)

    available_color = ChainedForeignKey(
        Cars,
        chained_field="car_model", # should be a field in THIS model
        chained_model_field="car_colors", # should be the matching field 
                                          # in the Cars model
        show_all=False,
        auto_choose=True
    )

И оба указанных поля должны быть ForeignKeys для одной и той же (третьей) модели.

Может быть, это работает, даже без изменения AdminForm (я также изменил названия моделей на единственное и удалил некоторые повторы, как диктует наиболее распространенное использование):

class Color(models.Model):
    name = models.CharField(max_length=50)

    def __unicode__(self):
        return self.name


class CarModel(models.Model):

    model = models.CharField(max_length=50)
    available_colors = models.ManytoManyField(Color, through='AvailableColor')

def __unicode__(self):
    return self.model

class AvailableColor(models.Model):

    car_model = models.ForeignKey(CarModel)
    color = models.ForeignKey(Color)

    def __unicode__(self): 
        return unicode(self.color)


class CarData(models.Model):

    car_barcode = models.CharField(max_length=50)
    car_model = models.ForeignKey(CarModel)

    car_color = ChainedForeignKey(
        AvailableColor,
        chained_field="car_model", # field in CarData
        chained_model_field="car_model", # field in AvailableColor
        show_all=False,
        auto_choose=True
    )

Вы не можете сделать иначе, потому что вам нужны две модели с подходящим FK. Используя Cars.car_colors.through (это допустимая модель для запроса и т. Д.), У вас не будет хорошего отображения. С (фиктивной) явной промежуточной моделью вы определяете Юникод , и администратор должен показывать правильные данные.

...