Использование UUID в качестве первичного ключа в моделях Django (влияние общих отношений)

Пожалуйста, попробуйте следующий код.

static void Main(string[] args)
    {
        string _wildCardPattern = "*.txt";

        List<string> _fileNames = new List<string>();
        _fileNames.Add("text_file.txt");
        _fileNames.Add("csv_file.csv");

        Console.WriteLine("\nFilenames that matches [{0}] pattern are : ", _wildCardPattern);
        foreach (string _fileName in _fileNames)
        {
            CustomWildCardPattern _patetrn = new CustomWildCardPattern(_wildCardPattern);
            if (_patetrn.IsMatch(_fileName))
            {
                Console.WriteLine("{0}", _fileName);
            }
        }

    }

public class CustomWildCardPattern : Regex
{
    public CustomWildCardPattern(string wildCardPattern)
        : base(WildcardPatternToRegex(wildCardPattern))
    {
    }

    public CustomWildCardPattern(string wildcardPattern, RegexOptions regexOptions)
        : base(WildcardPatternToRegex(wildcardPattern), regexOptions)
    {
    }

    private static string WildcardPatternToRegex(string wildcardPattern)
    {
        string patternWithWildcards = "^" + Regex.Escape(wildcardPattern).Replace("\\*", ".*");
        patternWithWildcards = patternWithWildcards.Replace("\\?", ".") + "$";
        return patternWithWildcards;
    }
}
80
задан mitchf 15 October 2010 в 16:10
поделиться

1 ответ

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

Псевдопервичный ключ

UUID Этот метод позволяет Вам усиливать преимущества UUID как псевдо-PK (использующий уникальный индекс), при поддержании автоувеличенного PK, чтобы обратиться к проблемам производительности наличия нечислового PK (фрагментация, вставить неисправность, и т.д.)

, Как это работает:

  1. Создают автоувеличенный первичный ключ, названный pkid на Ваших Моделях DB.
  2. Добавляют уникально индексированное поле UUID id, чтобы позволить Вам искать идентификатором UUID, вместо числового первичного ключа.
  3. Точка ForeighKey к UUID (использующий to_field='id'), чтобы позволить Вашим внешним ключам правильно представлять псевдо-PK вместо числового идентификатора.

По существу, Вы сделаете следующее:

Первый, создайте Базовую модель Django

class UUIDModel(models.Model):
    pkid = models.BigAutoField(primary_key=True, editable=False)
    id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)

, Удостоверяются, что расширили базовую модель вместо моделей. Модель

class Site(UUIDModel):
    name = models.CharField(max_length=255)

Также удостоверьтесь, что Ваши ForeignKeys указывают на поле UUID id вместо автоувеличенного pkid поле:

class Page(UUIDModel):
    site = models.ForeignKey(Site, to_field='id', on_delete=models.CASCADE)

при использовании Django Rest Framework (DRF) удостоверьтесь, что также заложили Основу класс ViewSet для установки поля поиска по умолчанию:

class UUIDModelViewSet(viewsets.ModelViewSet):
    lookup_field = 'id' 

И расширяют это вместо основного ModelViewSet для Ваших представлений API:

class SiteViewSet(BaseModelViewSet):
    model = Site

class PageViewSet(BaseModelViewSet):
    model = Page
[еще 1125] примечания по, почему и, как в этой статье: https://www.stevenmoseley.com/blog/uuid-primary-keys-django-rest-framework-2-steps

0
ответ дан 24 November 2019 в 09:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: