Django изменение структуры базы данных для обеспечения множественного выбора - PullRequest
0 голосов
/ 11 марта 2020

Я работаю над проектом, который требует некоторых изменений структуры базы данных, чтобы позволить пользователям выбирать несколько значений одновременно. Моя текущая структура состоит из взаимосвязанных моделей:

class Service_Specific(models.Model):
   title = models.CharField(max_length=100, help_text="title of service specific")
   category = models.ForeignKey(Service_Category, on_delete=models.CASCADE, null=True,
                             help_text="Id of service category")
   group = models.ForeignKey(Service_Group, on_delete=models.CASCADE, null=True,
                          help_text="Id of service group")
   type = models.ForeignKey(Service_Type, on_delete=models.CASCADE, null=True,
                         help_text="Id of service type")
   variant = models.ForeignKey(Service_Variant, on_delete=models.CASCADE, null=True, blank=True,
                            help_text="Id of service variant")
   tags = TaggableManager(blank=True)

def __str__(self):
    return '%s / %s / %s / %s' %(self.group, self.type, self.variant, self.title)

def save(self, *args, **kwargs):
    self.category = self.variant.category
    self.group = self.variant.group
    self.type = self.variant.type
    return super(Service_Specific, self).save(*args, **kwargs)

На данный момент эта модель используется для добавления услуг пользователю, который является поставщиком услуг, и работает нормально. (1 сервис за раз) пример (service_variant = "уроки игры на гитаре" -> service_specifi c = "electri c гитара") Проблема в том, что пользователи, как правило, предлагают несколько услуг, связанных с одним и тем же service_variant, и они раздражаются, потому что они не могут выбрать их всех сразу. Может кто-нибудь помочь мне найти правильную стратегию ?? Спасибо.

вот моя модель услуг провайдера:

class ProviderService(models.Model):

provider = models.ForeignKey(Provider, on_delete=models.CASCADE,
                             help_text="Name of the provider")
service = models.ForeignKey(Service, on_delete=models.CASCADE,
                            help_text="Service name under which this service is listed or to be listed")
age_group = MultiSelectField(choices=AGE_GROUP_CHOICE, blank=True, null=True,
                             help_text='Age group that the service is targeted at, Only useful with service category = tutoring')

мои сериализаторы:

class ProviderServiceSerializer(serializers.ModelSerializer):
provider = ProviderSerializer(many=False, read_only=True)
id = serializers.ReadOnlyField()
provider_id = serializers.ReadOnlyField()
service_object = serializers.SerializerMethodField()

class Meta:
    model = ProviderService
    fields = ('id', 'service', 'fee', 'fee_currency', 'fee_duration', 'provider', 'total_order_cleared',
              'is_group_session',
              'total_rating', 'rating', 'self_presentation', 'age_group', 'service_object', 'years_of_experience',
              'location_latitude', 'location_longitude', 'distance', 'availability_type', 'provider_id',
              'fee_duration_full_name',
              'fee_duration_plural', 'service_name')

def get_provider_object(self, obj):
    return ProviderSerializer(obj.provider).data

def get_service_object(self, obj):
    return ServiceDetailedSerializer(obj.service).data


class ServiceDetailedSerializer(serializers.ModelSerializer):
category = ServiceCategorySerializer(read_only=True)
group = ServiceGroupSerializer(read_only=True)
type = ServiceTypeSerializer(read_only=True)
variant = ServiceVariantSerializer(read_only=True)

class Meta:
    model = Service_Specific
    fields = ('id', 'category', 'group', 'type', 'variant', 'title')
...