Форум сайта python.su
Привет.
Застрял на Generic Relation.
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
content_type = models.ManyToManyField(ContentType,
limit_choices_to = {'model__in': ('Editor', 'Admin','Programming')},blank=True, null=True)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
info = models.CharField(max_lenght=10)
tel = models.CharField(max_lenght=10)
class Editor(models.Model):
pass
class Admin(models.Model):
pass
class Programming(models.Model):
pass
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
content_type = models.ManyToManyField(ContentType,
limit_choices_to = {'model__in': ('Editor', 'Admin','Programming')},blank=True, null=True)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
info = models.CharField(max_lenght=10)
tel = models.CharField(max_lenght=10)
class Editor(models.Model):
userprofile = models.ManyToManyKey(UserProfile)
Офлайн
В принципе тут все достаточно хорошо описано.
Основная идея использования GenericRelation - возможность иметь FK на разные модели.
content_object это атрибут который будет использоваться для доступа по FK. (если используются имена по умолчанию (content_type и object_id) - можно их не передавать в конструктор content_object)
Пример:
# Допустим ситуацию на Машинку могут устанавливаться разные модели GPS-трекеров
# Каждый трекер имеет свои уникальные особенности, потому хранить их в одной таблице сложно
# А через GenericRelations все достаточно симпатично решается
class Vehicle(models.Model):
content_type = models.ForeignKey()
# тут будет храниться id трекера
object_id = models.models.PositiveIntegerField()
# А через это поле мы будем получать к нему доступ
# Это собственно и есть content_objec
tracker = generic.GenericForeignKey()
class TrackerA(model.Model):
pass
class TrackerB(model.Model):
pass
# создаем новый Vehicle
tracker_A = TrackerA.objects.get(...)
tracker_B = TrackerB.objects.get(...)
vehicle_with_A_tracker = Vehicle.objects.create(content_type=ContentType.objects.get_for_model(tracker_A),
object_id = tracker_A.pk)
vehicle_with_B_tracker = Vehicle.objects.create(content_type=ContentType.objects.get_for_model(tracker_B),
object_id = tracker_B.pk)
...
KotakotaСуть действительно не в этом.
Я могу подцепить в класс “Редакторы”, необходимое мне количество людей.
А как тоже самое провернуть с Generic Relation? Или не в этом их суть?
Офлайн
pill, большое спасибо!
Я думал мне это поможет в решении следующей проблемы, которая может проблемой и не является, но мне не нравится как это выглядит!
Допустим есть три модели, каждая модель это определенные части автомобиля: колеса (Wheel), шины(Bus) и рули(Handlebar).
Есть еще две модели, определяющие типы автомобилей: грузовые (Cars) и не грузовые (Cargo).
К определенным типам автомобилей, мне нужно добавлять различные колеса, шины и рули.
Вот как я это сделал:
class Cars(models.Model):
wheels = models.ManyToManyField(Wheel)
bus = models.ManyToManyField(Bus)
handlebar = models.ManyToManyField(Handlebar)
name = models.CharField(max_lenght=10)
class Cargo(models.Model):
wheels = models.ManyToManyField(Wheel)
bus = models.ManyToManyField(Bus)
handlebar = models.ManyToManyField(Handlebar)
name = models.CharField(max_lenght=10)
class Wheel(models.Model):
model = models.CharField(max_lenght=10)
class Bus(models.Model):
model = models.CharField(max_lenght=10)
class Handlebar(models.Model):
model = models.CharField(max_lenght=10)
wheels = models.ManyToManyField(Wheel)
bus = models.ManyToManyField(Bus)
handlebar = models.ManyToManyField(Handlebar)
Офлайн
Думаю тут лучше всего использовать наследование
https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance
Будет что-то вроде:
class Car(models.Model):
wheels = models.ManyToManyField(Wheel)
bus = models.ManyToManyField(Bus)
handlebar = models.ManyToManyField(Handlebar)
name = models.CharField(max_lenght=10)
class Meta:
abstract = True
class Cargo(Car):
some_cargo_specific_field = models.CharField()
class Ligt(Car):
some_light_vehicle_specific_field = models.CharField()
Отредактировано (Сен. 21, 2011 11:47:35)
Офлайн
Спасибо!
Продолжаем изучать!
Офлайн